From: Ted Kremenek Date: Sat, 18 Feb 2012 22:02:57 +0000 (+0000) Subject: Fix crash in analyzer diagnostic generation involving subexpressions of OpaqueValueEx... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e215ba1c2a3f29fe2cbc4cfb0e532cd204970c49;p=clang Fix crash in analyzer diagnostic generation involving subexpressions of OpaqueValueExpr not appearing in the ParentMap. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150894 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ParentMap.cpp b/lib/AST/ParentMap.cpp index 5eef83a81a..64016d9cdd 100644 --- a/lib/AST/ParentMap.cpp +++ b/lib/AST/ParentMap.cpp @@ -26,6 +26,10 @@ static void BuildParentMap(MapTy& M, Stmt* S) { M[*I] = S; BuildParentMap(M, *I); } + + // Also include the source expr tree of an OpaqueValueExpr in the map. + if (const OpaqueValueExpr *OVE = dyn_cast(S)) + BuildParentMap(M, OVE->getSourceExpr()); } ParentMap::ParentMap(Stmt* S) : Impl(0) { diff --git a/test/Analysis/plist-output.m b/test/Analysis/plist-output.m index bed4a85cbe..691d6e60f2 100644 --- a/test/Analysis/plist-output.m +++ b/test/Analysis/plist-output.m @@ -58,6 +58,27 @@ int test_cond_assign() { return *p; } +// The following previously crashed when generating extensive diagnostics. +// +@interface RDar10797980_help +@property (readonly) int x; +@end + +@interface RDar10797980 { + RDar10797980_help *y; +} +- (void) test; +@end + +@implementation RDar10797980 +- (void) test { + if (y.x == 1) { + int *p = 0; + *p = 0xDEADBEEF; // expected-warning {{deference}} + } +} +@end + // CHECK: // CHECK: // CHECK: @@ -1189,6 +1210,185 @@ int test_cond_assign() { // CHECK: file0 // CHECK: // CHECK: +// CHECK: +// CHECK: path +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col3 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col3 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col7 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col7 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col7 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col7 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col3 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col3 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col3 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line75 +// CHECK: col3 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line76 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line76 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line76 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line76 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line77 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line77 +// CHECK: col6 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line77 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: ranges +// CHECK: +// CHECK: +// CHECK: +// CHECK: line77 +// CHECK: col6 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line77 +// CHECK: col6 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: extended_message +// CHECK: Dereference of null pointer (loaded from variable 'p') +// CHECK: message +// CHECK: Dereference of null pointer (loaded from variable 'p') +// CHECK: +// CHECK: +// CHECK: descriptionDereference of null pointer (loaded from variable 'p') +// CHECK: categoryLogic error +// CHECK: typeDereference of null pointer +// CHECK: location +// CHECK: +// CHECK: line77 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: // CHECK: // CHECK: // CHECK: +