[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