[cfe-commits] r168070 - in /cfe/trunk: lib/StaticAnalyzer/Core/BugReporter.cpp lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp lib/StaticAnalyzer/Core/PathDiagnostic.cpp test/Analysis/coverage.c test/Analysis/keychainAPI.m test/Analysis/malloc-annotations.c test/Analysis/malloc-interprocedural.c test/Analysis/malloc-plist.c test/Analysis/malloc.c test/Analysis/malloc.cpp test/Analysis/plist-output-alternate.m test/Analysis/retain-release.m test/Analysis/simple-stream-checks.c test/Analysis/stackaddrleak.c
Anna Zaks
ganna at apple.com
Fri Nov 16 14:47:09 PST 2012
On Nov 15, 2012, at 11:11 AM, Jordan Rose <jordan_rose at apple.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list