On Nov 15, 2012, at 11:11 AM, Jordan Rose <[email protected]> wrote:
> Author: jrose > Date: Thu Nov 15 13:11:43 2012 > New Revision: 168070 > > URL: http://llvm.org/viewvc/llvm-project?rev=168070&view=rev > Log: > [analyzer] Report leaks at the closing brace of a function body. > > This fixes a few cases where we'd emit path notes like this: > > +---+ > 1| v > p = malloc(len); > ^ |2 > +---+ > > In general this should make path notes more consistent and more correct, > especially in cases where the leak happens on the false branch of an if > that jumps directly to the end of the function. There are a couple places > where the leak is reported farther away from the cause; these are usually > cases where there are several levels of nested braces before the end of > the function. This still matches our current behavior for when there /is/ > a statement after all the braces, though. > > Modified: > cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp > cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp > cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp > cfe/trunk/test/Analysis/coverage.c > cfe/trunk/test/Analysis/keychainAPI.m > cfe/trunk/test/Analysis/malloc-annotations.c > cfe/trunk/test/Analysis/malloc-interprocedural.c > cfe/trunk/test/Analysis/malloc-plist.c > cfe/trunk/test/Analysis/malloc.c > cfe/trunk/test/Analysis/malloc.cpp > cfe/trunk/test/Analysis/plist-output-alternate.m > cfe/trunk/test/Analysis/retain-release.m > cfe/trunk/test/Analysis/simple-stream-checks.c > cfe/trunk/test/Analysis/stackaddrleak.c > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp Thu Nov 15 13:11:43 2012 > @@ -1673,6 +1673,9 @@ > if (const BinaryOperator *B = dyn_cast<BinaryOperator>(S)) > return PathDiagnosticLocation::createOperatorLoc(B, SM); > > + if (isa<PostStmtPurgeDeadSymbols>(ErrorNode->getLocation())) > + return PathDiagnosticLocation::createEnd(S, SM, LC); > + It is unfortunate that we have to copy and paste this multiple times. Maybe we could create a subroutine that constructs a PathDiagnosticLocation for a StmtPoint? Anna. > return PathDiagnosticLocation::createBegin(S, SM, LC); > } > } else { > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp Thu Nov 15 > 13:11:43 2012 > @@ -177,14 +177,15 @@ > return; > } > > - // Here, we call the Symbol Reaper with 0 stack context telling it to > clean up > - // everything on the stack. We use LastStmt as a diagnostic statement, > with > - // which the program point will be associated. However, we only want to use > - // LastStmt as a reference for what to clean up if it's a ReturnStmt; > - // otherwise, everything is dead. > + // Here, we destroy the current location context. We use the current > + // function's entire body as a diagnostic statement, with which the program > + // point will be associated. However, we only want to use LastStmt as a > + // reference for what to clean up if it's a ReturnStmt; otherwise, > everything > + // is dead. > SaveAndRestore<const NodeBuilderContext *> NodeContextRAII(currBldrCtx, > &BC); > - removeDead(Pred, Dst, dyn_cast<ReturnStmt>(LastSt), > - Pred->getLocationContext(), LastSt, > + const LocationContext *LCtx = Pred->getLocationContext(); > + removeDead(Pred, Dst, dyn_cast<ReturnStmt>(LastSt), LCtx, > + LCtx->getAnalysisDeclContext()->getBody(), > ProgramPoint::PostStmtPurgeDeadSymbolsKind); > } > > @@ -289,9 +290,10 @@ > currBldrCtx = &Ctx; > // Here, we call the Symbol Reaper with 0 statement and callee location > // context, telling it to clean up everything in the callee's context > - // (and its children). We use LastSt as a diagnostic statement, which > - // which the program point will be associated. > - removeDead(BindedRetNode, CleanedNodes, 0, calleeCtx, LastSt, > + // (and its children). We use the callee's function body as a diagnostic > + // statement, with which the program point will be associated. > + removeDead(BindedRetNode, CleanedNodes, 0, calleeCtx, > + calleeCtx->getAnalysisDeclContext()->getBody(), > ProgramPoint::PostStmtPurgeDeadSymbolsKind); > currBldrCtx = 0; > } else { > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Thu Nov 15 13:11:43 > 2012 > @@ -588,6 +588,8 @@ > } > else if (const StmtPoint *SP = dyn_cast<StmtPoint>(&P)) { > S = SP->getStmt(); > + if (isa<PostStmtPurgeDeadSymbols>(P)) > + return PathDiagnosticLocation::createEnd(S, SMng, > P.getLocationContext()); > } > else if (const PostImplicitCall *PIE = dyn_cast<PostImplicitCall>(&P)) { > return PathDiagnosticLocation(PIE->getLocation(), SMng); > @@ -619,12 +621,16 @@ > > while (NI) { > ProgramPoint P = NI->getLocation(); > - if (const StmtPoint *PS = dyn_cast<StmtPoint>(&P)) > + if (const StmtPoint *PS = dyn_cast<StmtPoint>(&P)) { > S = PS->getStmt(); > - else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) > + if (isa<PostStmtPurgeDeadSymbols>(P)) > + return PathDiagnosticLocation::createEnd(S, SM, > + NI->getLocationContext()); > + break; > + } else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) { > S = BE->getSrc()->getTerminator(); > - if (S) > break; > + } > NI = NI->succ_empty() ? 0 : *(NI->succ_begin()); > } > > > Modified: cfe/trunk/test/Analysis/coverage.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/coverage.c?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/coverage.c (original) > +++ cfe/trunk/test/Analysis/coverage.c Thu Nov 15 13:11:43 2012 > @@ -32,27 +32,27 @@ > > void coverage1(int *x) { > function_which_gives_up(x); > - char *m = (char*)malloc(12); // expected-warning {{potential leak}} > -} > + char *m = (char*)malloc(12); > +} // expected-warning {{potential leak}} > > void coverage2(int *x) { > if (x) { > function_which_gives_up(x); > - char *m = (char*)malloc(12);// expected-warning {{potential leak}} > + char *m = (char*)malloc(12); > } > -} > +} // expected-warning {{potential leak}} > > void coverage3(int *x) { > x++; > function_which_gives_up(x); > - char *m = (char*)malloc(12);// expected-warning {{potential leak}} > -} > + char *m = (char*)malloc(12); > +} // expected-warning {{potential leak}} > > void coverage4(int *x) { > *x += another_function(x); > function_which_gives_up(x); > - char *m = (char*)malloc(12);// expected-warning {{potential leak}} > -} > + char *m = (char*)malloc(12); > +} // expected-warning {{potential leak}} > > void coverage5(int *x) { > for (int i = 0; i<7; ++i) > @@ -65,8 +65,8 @@ > for (int i = 0; i<3; ++i) { > function_which_gives_up(x); > } > - char *m = (char*)malloc(12); // expected-warning {{potential leak}} > -} > + char *m = (char*)malloc(12); > +} // expected-warning {{potential leak}} > > int coverage7_inline(int *i) { > function_which_doesnt_give_up(&i); > @@ -77,8 +77,8 @@ > int y; > function_which_doesnt_give_up_nested(x, &y); > y = (*x)/y; // expected-warning {{Division by zero}} > - char *m = (char*)malloc(12); // expected-warning {{potential leak}} > -} > + char *m = (char*)malloc(12); > +} // expected-warning {{potential leak}} > > void function_which_gives_up_settonull(int **x) { > *x = 0; > > Modified: cfe/trunk/test/Analysis/keychainAPI.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/keychainAPI.m?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/keychainAPI.m (original) > +++ cfe/trunk/test/Analysis/keychainAPI.m Thu Nov 15 13:11:43 2012 > @@ -76,9 +76,9 @@ > UInt32 length; > void *outData; > st = SecKeychainItemCopyContent(2, ptr, ptr, &length, &outData); > - if (st == GenericError) // expected-warning{{Allocated data is not > released: missing a call to 'SecKeychainItemFreeContent'}} > + if (st == GenericError) > SecKeychainItemFreeContent(ptr, outData); // expected-warning{{Only call > free if a valid (non-NULL) buffer was returned}} > -} > +} // expected-warning{{Allocated data is not released: missing a call to > 'SecKeychainItemFreeContent'}} > > // If null is passed in, the data is not allocated, so no need for the > matching free. > void fooDoNotReportNull() { > > Modified: cfe/trunk/test/Analysis/malloc-annotations.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc-annotations.c?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/malloc-annotations.c (original) > +++ cfe/trunk/test/Analysis/malloc-annotations.c Thu Nov 15 13:11:43 2012 > @@ -63,8 +63,8 @@ > } > > void af1_b() { > - int *p = my_malloc(12); // expected-warning{{Memory is never released; > potential leak}} > -} > + int *p = my_malloc(12); > +} // expected-warning{{Memory is never released; potential leak}} > > void af1_c() { > myglobalpointer = my_malloc(12); // no-warning > @@ -72,8 +72,8 @@ > > void af1_d() { > struct stuff mystuff; > - mystuff.somefield = my_malloc(12); // expected-warning{{Memory is never > released; potential leak}} > -} > + mystuff.somefield = my_malloc(12); > +} // expected-warning{{Memory is never released; potential leak}} > > // Test that we can pass out allocated memory via pointer-to-pointer. > void af1_e(void **pp) { > > Modified: cfe/trunk/test/Analysis/malloc-interprocedural.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc-interprocedural.c?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/malloc-interprocedural.c (original) > +++ cfe/trunk/test/Analysis/malloc-interprocedural.c Thu Nov 15 13:11:43 2012 > @@ -31,8 +31,8 @@ > > static void test1() { > void *data = 0; > - my_malloc1(&data, 4); // expected-warning {{Memory is never released; > potential leak of memory pointed to by 'data'}} > -} > + my_malloc1(&data, 4); > +} // expected-warning {{Memory is never released; potential leak of memory > pointed to by 'data'}} > > static void test11() { > void *data = 0; > @@ -44,8 +44,8 @@ > void *data = my_malloc2(1, 4); > data = 0; > int x = 5;// expected-warning {{Memory is never released; potential leak of > memory pointed to by 'data'}} > - data = my_malloc2(1, 4);// expected-warning {{Memory is never released; > potential leak of memory pointed to by 'data'}} > -} > + data = my_malloc2(1, 4); > +} // expected-warning {{Memory is never released; potential leak of memory > pointed to by 'data'}} > > static void test3() { > void *data = my_malloc2(1, 4); > @@ -122,10 +122,14 @@ > } > > void useStrndup(size_t n) { > - if (n == 0) > + if (n == 0) { > (void)strndup(0, 20); // no-warning > - else if (n < 5) > + return; > + } else if (n < 5) { > (void)strndup("hi there", n); // no-warning > - else > - (void)strndup("hi there", n); // expected-warning{{leak}} > + return; > + } else { > + (void)strndup("hi there", n); > + return; // expected-warning{{leak}} > + } > } > > Modified: cfe/trunk/test/Analysis/malloc-plist.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc-plist.c?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/malloc-plist.c (original) > +++ cfe/trunk/test/Analysis/malloc-plist.c Thu Nov 15 13:11:43 2012 > @@ -517,13 +517,13 @@ > // CHECK-NEXT: <key>end</key> > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>21</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>22</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>21</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>22</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </array> > @@ -534,8 +534,8 @@ > // CHECK-NEXT: <key>kind</key><string>event</string> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>21</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>22</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <key>depth</key><integer>0</integer> > @@ -550,11 +550,11 @@ > // CHECK-NEXT: <key>type</key><string>Memory leak</string> > // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> > // CHECK-NEXT: <key>issue_context</key><string>myArrayAllocation</string> > -// CHECK-NEXT: <key>issue_hash</key><integer>3</integer> > +// CHECK-NEXT: <key>issue_hash</key><integer>4</integer> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>21</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>22</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </dict> > @@ -1301,13 +1301,13 @@ > // CHECK-NEXT: <key>end</key> > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>45</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>46</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>45</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>46</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </array> > @@ -1318,8 +1318,8 @@ > // CHECK-NEXT: <key>kind</key><string>event</string> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>45</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>46</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <key>depth</key><integer>0</integer> > @@ -1334,11 +1334,11 @@ > // CHECK-NEXT: <key>type</key><string>Memory leak</string> > // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> > // CHECK-NEXT: <key>issue_context</key><string>test_wrapper</string> > -// CHECK-NEXT: <key>issue_hash</key><integer>2</integer> > +// CHECK-NEXT: <key>issue_hash</key><integer>3</integer> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>45</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>46</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </dict> > @@ -2636,40 +2636,6 @@ > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > // CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: </array> > -// CHECK-NEXT: <key>end</key> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>9</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>26</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: </array> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: </array> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>kind</key><string>control</string> > -// CHECK-NEXT: <key>edges</key> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>start</key> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > // CHECK-NEXT: <key>col</key><integer>9</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > @@ -2682,13 +2648,13 @@ > // CHECK-NEXT: <key>end</key> > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>87</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>87</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </array> > @@ -2699,8 +2665,8 @@ > // CHECK-NEXT: <key>kind</key><string>event</string> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>87</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <key>depth</key><integer>0</integer> > @@ -2715,11 +2681,11 @@ > // CHECK-NEXT: <key>type</key><string>Memory leak</string> > // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> > // CHECK-NEXT: <key>issue_context</key><string>use_ret</string> > -// CHECK-NEXT: <key>issue_hash</key><integer>2</integer> > +// CHECK-NEXT: <key>issue_hash</key><integer>3</integer> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>86</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>87</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </dict> > @@ -3049,13 +3015,13 @@ > // CHECK-NEXT: <key>end</key> > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>103</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>104</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>103</integer> > -// CHECK-NEXT: <key>col</key><integer>8</integer> > +// CHECK-NEXT: <key>line</key><integer>104</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </array> > @@ -3066,8 +3032,8 @@ > // CHECK-NEXT: <key>kind</key><string>event</string> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>103</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>104</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <key>depth</key><integer>1</integer> > @@ -3082,11 +3048,11 @@ > // CHECK-NEXT: <key>type</key><string>Memory leak</string> > // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> > // CHECK-NEXT: <key>issue_context</key><string>function_with_leak1</string> > -// CHECK-NEXT: <key>issue_hash</key><integer>1</integer> > +// CHECK-NEXT: <key>issue_hash</key><integer>2</integer> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>103</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>104</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </dict> > @@ -4482,11 +4448,45 @@ > // CHECK-NEXT: <string>Returned allocated memory</string> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>control</string> > +// CHECK-NEXT: <key>edges</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>start</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>169</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>169</integer> > +// CHECK-NEXT: <key>col</key><integer>23</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>end</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>170</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>170</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > // CHECK-NEXT: <key>kind</key><string>event</string> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>169</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>170</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <key>depth</key><integer>0</integer> > @@ -4501,11 +4501,11 @@ > // CHECK-NEXT: <key>type</key><string>Memory leak</string> > // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> > // CHECK-NEXT: > <key>issue_context</key><string>use_function_with_leak7</string> > -// CHECK-NEXT: <key>issue_hash</key><integer>1</integer> > +// CHECK-NEXT: <key>issue_hash</key><integer>2</integer> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>169</integer> > -// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>line</key><integer>170</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </dict> > > Modified: cfe/trunk/test/Analysis/malloc.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc.c?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/malloc.c (original) > +++ cfe/trunk/test/Analysis/malloc.c Thu Nov 15 13:11:43 2012 > @@ -102,8 +102,8 @@ > } > > void reallocPtrZero1() { > - char *r = realloc(0, 12); // expected-warning {{Memory is never released; > potential leak of memory pointed to by 'r'}} > -} > + char *r = realloc(0, 12); > +} // expected-warning {{Memory is never released; potential leak of memory > pointed to by 'r'}} > > void reallocPtrZero2() { > char *r = realloc(0, 12); > @@ -128,12 +128,12 @@ > void reallocRadar6337483_2() { > char *buf = malloc(100); > char *buf2 = (char*)realloc(buf, 0x1000000); > - if (!buf2) { // expected-warning {{Memory is never released; potential > leak}} > + if (!buf2) { > ; > } else { > free(buf2); > } > -} > +} // expected-warning {{Memory is never released; potential leak}} > > void reallocRadar6337483_3() { > char * buf = malloc(100); > @@ -186,8 +186,8 @@ > } > > void reallocfPtrZero1() { > - char *r = reallocf(0, 12); // expected-warning {{Memory is never released; > potential leak}} > -} > + char *r = reallocf(0, 12); > +} // expected-warning {{Memory is never released; potential leak}} > > > // This case tests that storing malloc'ed memory to a static variable which is > @@ -384,13 +384,13 @@ > void mallocEscapeMalloc() { > int *p = malloc(12); > myfoo(p); > - p = malloc(12); // expected-warning{{Memory is never released; potential > leak}} > -} > + p = malloc(12); > +} // expected-warning{{Memory is never released; potential leak}} > > void mallocMalloc() { > int *p = malloc(12); > - p = malloc(12); // expected-warning {{Memory is never released; potential > leak}} > -} > + p = malloc(12); > +} // expected-warning {{Memory is never released; potential leak}} > > void mallocFreeMalloc() { > int *p = malloc(12); > @@ -454,8 +454,8 @@ > > void mallocAssignment() { > char *p = malloc(12); > - p = fooRetPtr(); // expected-warning {{leak}} > -} > + p = fooRetPtr(); > +} // expected-warning {{leak}} > > int vallocTest() { > char *mem = valloc(12); > @@ -624,8 +624,8 @@ > void doNotInvalidateWhenPassedToSystemCalls(char *s) { > char *p = malloc(12); > strlen(p); > - strcpy(p, s); // expected-warning {{leak}} > -} > + strcpy(p, s); > +} // expected-warning {{leak}} > > // Rely on the CString checker evaluation of the strcpy API to convey that > the result of strcpy is equal to p. > void symbolLostWithStrcpy(char *s) { > @@ -671,8 +671,8 @@ > // Test various allocation/deallocation functions. > void testStrdup(const char *s, unsigned validIndex) { > char *s2 = strdup(s); > - s2[validIndex + 1] = 'b';// expected-warning {{Memory is never released; > potential leak}} > -} > + s2[validIndex + 1] = 'b'; > +} // expected-warning {{Memory is never released; potential leak}} > > int testStrndup(const char *s, unsigned validIndex, unsigned size) { > char *s2 = strndup(s, size); > @@ -780,10 +780,11 @@ > buffer = malloc(myValueSize); > > // do stuff with the buffer > - if (buffer == stackBuffer) // expected-warning {{leak}} > + if (buffer == stackBuffer) > return; > -} > - > + else > + return; // expected-warning {{leak}} > +} > // <rdar://problem/11269741> Previously this triggered a false positive > // because malloc() is known to return uninitialized memory and the binding > // of 'o' to 'p->n' was not getting propertly handled. Now we report a leak. > @@ -819,8 +820,8 @@ > void radar_11358224_test_double_assign_ints_positive_2() > { > void *ptr = malloc(16); > - ptr = ptr; // expected-warning {{leak}} > -} > + ptr = ptr; > +} // expected-warning {{leak}} > > // Assume that functions which take a function pointer can free memory even if > // they are defined in system headers and take the const pointer to the > @@ -834,8 +835,8 @@ > // Null is passed as callback. > void r11160612_2() { > char *x = malloc(12); > - const_ptr_and_callback(0, x, 12, 0); // expected-warning {{leak}} > -} > + const_ptr_and_callback(0, x, 12, 0); > +} // expected-warning {{leak}} > > // Callback is passed to a function defined in a system header. > void r11160612_4() { > @@ -935,14 +936,14 @@ > void localArrayTest() { > char *p = (char*)malloc(12); > char *ArrayL[12]; > - ArrayL[0] = p; // expected-warning {{leak}} > -} > + ArrayL[0] = p; > +} // expected-warning {{leak}} > > void localStructTest() { > StructWithPtr St; > StructWithPtr *pSt = &St; > - pSt->memP = malloc(12); // expected-warning{{Memory is never released; > potential leak}} > -} > + pSt->memP = malloc(12); > +} // expected-warning{{Memory is never released; potential leak}} > > // Test double assignment through integers. > static long glob; > @@ -955,8 +956,8 @@ > void test_double_assign_ints_positive() > { > void *ptr = malloc(16); > - (void*)(long)(unsigned long)ptr; // expected-warning {{unused}} > expected-warning {{leak}} > -} > + (void*)(long)(unsigned long)ptr; // expected-warning {{unused}} > +} // expected-warning {{leak}} > > > void testCGContextNoLeak() > > Modified: cfe/trunk/test/Analysis/malloc.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc.cpp?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/malloc.cpp (original) > +++ cfe/trunk/test/Analysis/malloc.cpp Thu Nov 15 13:11:43 2012 > @@ -8,8 +8,8 @@ > > > void checkThatMallocCheckerIsRunning() { > - malloc(4); // expected-warning{{leak}} > -} > + malloc(4); > +} // expected-warning{{leak}} > > // Test for radar://11110132. > struct Foo { > > Modified: cfe/trunk/test/Analysis/plist-output-alternate.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/plist-output-alternate.m?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/plist-output-alternate.m (original) > +++ cfe/trunk/test/Analysis/plist-output-alternate.m Thu Nov 15 13:11:43 2012 > @@ -1199,40 +1199,6 @@ > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > // CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: </array> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: </array> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>kind</key><string>control</string> > -// CHECK-NEXT: <key>edges</key> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>start</key> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: </array> > -// CHECK-NEXT: <key>end</key> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > // CHECK-NEXT: <key>col</key><integer>10</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > @@ -1266,13 +1232,13 @@ > // CHECK-NEXT: <key>end</key> > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>58</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>58</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </array> > @@ -1283,25 +1249,10 @@ > // CHECK-NEXT: <key>kind</key><string>event</string> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>58</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > -// CHECK-NEXT: <key>ranges</key> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <array> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>14</integer> > -// CHECK-NEXT: <key>file</key><integer>0</integer> > -// CHECK-NEXT: </dict> > -// CHECK-NEXT: </array> > -// CHECK-NEXT: </array> > // CHECK-NEXT: <key>depth</key><integer>0</integer> > // CHECK-NEXT: <key>extended_message</key> > // CHECK-NEXT: <string>Object leaked: object allocated and stored into > 'value' is not referenced later in this execution path and has a > retain count of +1</string> > @@ -1314,11 +1265,11 @@ > // CHECK-NEXT: <key>type</key><string>Leak</string> > // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> > // CHECK-NEXT: <key>issue_context</key><string>rdar8331641</string> > -// CHECK-NEXT: <key>issue_hash</key><integer>5</integer> > +// CHECK-NEXT: <key>issue_hash</key><integer>6</integer> > // CHECK-NEXT: <key>location</key> > // CHECK-NEXT: <dict> > -// CHECK-NEXT: <key>line</key><integer>57</integer> > -// CHECK-NEXT: <key>col</key><integer>3</integer> > +// CHECK-NEXT: <key>line</key><integer>58</integer> > +// CHECK-NEXT: <key>col</key><integer>1</integer> > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </dict> > > Modified: cfe/trunk/test/Analysis/retain-release.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/retain-release.m?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/retain-release.m (original) > +++ cfe/trunk/test/Analysis/retain-release.m Thu Nov 15 13:11:43 2012 > @@ -474,8 +474,8 @@ > void f13_autorelease_b() { > CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); > [(id) A autorelease]; > - [(id) A autorelease]; // expected-warning{{Object sent -autorelease too > many times}} > -} > + [(id) A autorelease]; > +} // expected-warning{{Object sent -autorelease too many times}} > > CFMutableArrayRef f13_autorelease_c() { > CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); > > Modified: cfe/trunk/test/Analysis/simple-stream-checks.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/simple-stream-checks.c?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/simple-stream-checks.c (original) > +++ cfe/trunk/test/Analysis/simple-stream-checks.c Thu Nov 15 13:11:43 2012 > @@ -44,8 +44,8 @@ > } > > void leakOnEnfOfPath1(int *Data) { > - FILE *F = fopen("myfile.txt", "w");// expected-warning {{Opened file is > never closed; potential resource leak}} > -} > + FILE *F = fopen("myfile.txt", "w"); > +} // expected-warning {{Opened file is never closed; potential resource > leak}} > > void leakOnEnfOfPath2(int *Data) { > FILE *F = fopen("myfile.txt", "w"); > > Modified: cfe/trunk/test/Analysis/stackaddrleak.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/stackaddrleak.c?rev=168070&r1=168069&r2=168070&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/stackaddrleak.c (original) > +++ cfe/trunk/test/Analysis/stackaddrleak.c Thu Nov 15 13:11:43 2012 > @@ -4,8 +4,8 @@ > > void f0() { > char const str[] = "This will change"; > - p = str; // expected-warning{{Address of stack memory associated with > local variable 'str' is still referred to by the global variable 'p' upon > returning to the caller. This will be a dangling reference}} > -} > + p = str; > +} // expected-warning{{Address of stack memory associated with local > variable 'str' is still referred to by the global variable 'p' upon returning > to the caller. This will be a dangling reference}} > > void f1() { > char const str[] = "This will change"; > @@ -14,8 +14,8 @@ > } > > void f2() { > - p = (const char *) __builtin_alloca(12); // expected-warning{{Address of > stack memory allocated by call to alloca() on line 17 is still referred to by > the global variable 'p' upon returning to the caller. This will be a > dangling reference}} > -} > + p = (const char *) __builtin_alloca(12); > +} // expected-warning{{Address of stack memory allocated by call to alloca() > on line 17 is still referred to by the global variable 'p' upon returning to > the caller. This will be a dangling reference}} > > // PR 7383 - previosly the stack address checker would crash on this example > // because it would attempt to do a direct load from 'pr7383_list'. > @@ -30,5 +30,5 @@ > static int *a, *b; > int x; > a = &x; > - b = &x; // expected-warning{{Address of stack memory associated with local > variable 'x' is still referred to by the global variable 'a' upon returning}} > expected-warning{{Address of stack memory associated with local variable 'x' > is still referred to by the global variable 'b' upon returning}} > -} > + b = &x; > +} // expected-warning{{Address of stack memory associated with local > variable 'x' is still referred to by the global variable 'a' upon returning}} > expected-warning{{Address of stack memory associated with local variable 'x' > is still referred to by the global variable 'b' upon returning}} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
