[cfe-commits] r128148 - in /cfe/trunk: include/clang/Sema/DelayedDiagnostic.h lib/Sema/CMakeLists.txt lib/Sema/DelayedDiagnostic.cpp lib/Sema/SemaDeclAttr.cpp
Douglas Gregor
dgregor at apple.com
Wed Mar 23 08:13:45 PDT 2011
Author: dgregor
Date: Wed Mar 23 10:13:44 2011
New Revision: 128148
URL: http://llvm.org/viewvc/llvm-project?rev=128148&view=rev
Log:
Teach DelayedDiagnostic to copy its string, rather than hope that the
string itself lives longer than the DelayedDiagnostic. Fixes a recent
use-after-free regression due to my availability attribute work.
Added:
cfe/trunk/lib/Sema/DelayedDiagnostic.cpp (with props)
Modified:
cfe/trunk/include/clang/Sema/DelayedDiagnostic.h
cfe/trunk/lib/Sema/CMakeLists.txt
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
Modified: cfe/trunk/include/clang/Sema/DelayedDiagnostic.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/DelayedDiagnostic.h?rev=128148&r1=128147&r2=128148&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/DelayedDiagnostic.h (original)
+++ cfe/trunk/include/clang/Sema/DelayedDiagnostic.h Wed Mar 23 10:13:44 2011
@@ -119,25 +119,11 @@
SourceLocation Loc;
- void destroy() {
- switch (Kind) {
- case Access: getAccessData().~AccessedEntity(); break;
- case Deprecation: break;
- }
- }
+ void Destroy();
static DelayedDiagnostic makeDeprecation(SourceLocation Loc,
const NamedDecl *D,
- llvm::StringRef Msg) {
- DelayedDiagnostic DD;
- DD.Kind = Deprecation;
- DD.Triggered = false;
- DD.Loc = Loc;
- DD.DeprecationData.Decl = D;
- DD.DeprecationData.Message = Msg.data();
- DD.DeprecationData.MessageLen = Msg.size();
- return DD;
- }
+ llvm::StringRef Msg);
static DelayedDiagnostic makeAccess(SourceLocation Loc,
const AccessedEntity &Entity) {
Modified: cfe/trunk/lib/Sema/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/CMakeLists.txt?rev=128148&r1=128147&r2=128148&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/CMakeLists.txt (original)
+++ cfe/trunk/lib/Sema/CMakeLists.txt Wed Mar 23 10:13:44 2011
@@ -5,6 +5,7 @@
AttributeList.cpp
CodeCompleteConsumer.cpp
DeclSpec.cpp
+ DelayedDiagnostic.cpp
IdentifierResolver.cpp
JumpDiagnostics.cpp
Sema.cpp
Added: cfe/trunk/lib/Sema/DelayedDiagnostic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/DelayedDiagnostic.cpp?rev=128148&view=auto
==============================================================================
--- cfe/trunk/lib/Sema/DelayedDiagnostic.cpp (added)
+++ cfe/trunk/lib/Sema/DelayedDiagnostic.cpp Wed Mar 23 10:13:44 2011
@@ -0,0 +1,51 @@
+//===--- DelayedDiagnostic.cpp - Delayed declarator diagnostics -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the DelayedDiagnostic class implementation, which
+// is used to record diagnostics that are being conditionally produced
+// during declarator parsing.
+//
+// This file also defines AccessedEntity.
+//
+//===----------------------------------------------------------------------===//
+#include "clang/Sema/DelayedDiagnostic.h"
+#include <string.h>
+using namespace clang;
+using namespace sema;
+
+DelayedDiagnostic DelayedDiagnostic::makeDeprecation(SourceLocation Loc,
+ const NamedDecl *D,
+ llvm::StringRef Msg) {
+ DelayedDiagnostic DD;
+ DD.Kind = Deprecation;
+ DD.Triggered = false;
+ DD.Loc = Loc;
+ DD.DeprecationData.Decl = D;
+ char *MessageData = 0;
+ if (Msg.size()) {
+ MessageData = new char [Msg.size()];
+ memcpy(MessageData, Msg.data(), Msg.size());
+ }
+
+ DD.DeprecationData.Message = MessageData;
+ DD.DeprecationData.MessageLen = Msg.size();
+ return DD;
+}
+
+void DelayedDiagnostic::Destroy() {
+ switch (Kind) {
+ case Access:
+ getAccessData().~AccessedEntity();
+ break;
+
+ case Deprecation:
+ delete [] DeprecationData.Message;
+ break;
+ }
+}
Propchange: cfe/trunk/lib/Sema/DelayedDiagnostic.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cfe/trunk/lib/Sema/DelayedDiagnostic.cpp
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: cfe/trunk/lib/Sema/DelayedDiagnostic.cpp
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=128148&r1=128147&r2=128148&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Wed Mar 23 10:13:44 2011
@@ -3095,7 +3095,7 @@
// Destroy all the delayed diagnostics we're about to pop off.
for (unsigned i = state.SavedStackSize, e = DD.StackSize; i != e; ++i)
- DD.Stack[i].destroy();
+ DD.Stack[i].Destroy();
DD.StackSize = state.SavedStackSize;
}
More information about the cfe-commits
mailing list