diff options
-rw-r--r-- | include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h | 43 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/Environment.cpp | 4 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngine.cpp | 28 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp | 25 | ||||
-rw-r--r-- | test/Analysis/malloc-plist.c | 274 | ||||
-rw-r--r-- | test/Analysis/malloc.c | 5 | ||||
-rw-r--r-- | test/Analysis/plist-output-alternate.m | 67 |
7 files changed, 262 insertions, 184 deletions
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 78b254222e..17de90e000 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -154,26 +154,33 @@ public: const ExplodedGraph& getGraph() const { return G; } /// \brief Run the analyzer's garbage collection - remove dead symbols and - /// bindings. + /// bindings from the state. /// - /// \param Node - The predecessor node, from which the processing should - /// start. - /// \param Out - The returned set of output nodes. - /// \param ReferenceStmt - Run garbage collection using the symbols, - /// which are live before the given statement. - /// \param LC - The location context of the ReferenceStmt. - /// \param DiagnosticStmt - the statement used to associate the diagnostic - /// message, if any warnings should occur while removing the dead (leaks - /// are usually reported here). - /// \param K - In some cases it is possible to use PreStmt kind. (Do - /// not use it unless you know what you are doing.) - /// If the ReferenceStmt is NULL, everything is this and parent contexts is - /// considered live. - /// If the stack frame context is NULL, everything on stack is considered - /// dead. + /// Checkers can participate in this process with two callbacks: + /// \c checkLiveSymbols and \c checkDeadSymbols. See the CheckerDocumentation + /// class for more information. + /// + /// \param Node The predecessor node, from which the processing should start. + /// \param Out The returned set of output nodes. + /// \param ReferenceStmt The statement which is about to be processed. + /// Everything needed for this statement should be considered live. + /// A null statement means that everything in child LocationContexts + /// is dead. + /// \param LC The location context of the \p ReferenceStmt. A null location + /// context means that we have reached the end of analysis and that + /// all statements and local variables should be considered dead. + /// \param DiagnosticStmt Used as a location for any warnings that should + /// occur while removing the dead (e.g. leaks). By default, the + /// \p ReferenceStmt is used. + /// \param K Denotes whether this is a pre- or post-statement purge. This + /// must only be ProgramPoint::PostStmtPurgeDeadSymbolsKind if an + /// entire location context is being cleared, in which case the + /// \p ReferenceStmt must either be a ReturnStmt or \c NULL. Otherwise, + /// it must be ProgramPoint::PreStmtPurgeDeadSymbolsKind (the default) + /// and \p ReferenceStmt must be valid (non-null). void removeDead(ExplodedNode *Node, ExplodedNodeSet &Out, - const Stmt *ReferenceStmt, const StackFrameContext *LC, - const Stmt *DiagnosticStmt, + const Stmt *ReferenceStmt, const LocationContext *LC, + const Stmt *DiagnosticStmt = 0, ProgramPoint::Kind K = ProgramPoint::PreStmtPurgeDeadSymbolsKind); /// processCFGElement - Called by CoreEngine. Used to generate new successor diff --git a/lib/StaticAnalyzer/Core/Environment.cpp b/lib/StaticAnalyzer/Core/Environment.cpp index bab89c545c..7dcd12c5bd 100644 --- a/lib/StaticAnalyzer/Core/Environment.cpp +++ b/lib/StaticAnalyzer/Core/Environment.cpp @@ -241,6 +241,10 @@ EnvironmentManager::removeDeadBindings(Environment Env, // Mark all symbols in the block expr's value live. RSScaner.scan(X); continue; + } else { + SymExpr::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end(); + for (; SI != SE; ++SI) + SymReaper.maybeDead(*SI); } } diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 045591c907..42bfe144db 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -268,22 +268,39 @@ static bool shouldRemoveDeadBindings(AnalysisManager &AMgr, void ExprEngine::removeDead(ExplodedNode *Pred, ExplodedNodeSet &Out, const Stmt *ReferenceStmt, - const StackFrameContext *LC, + const LocationContext *LC, const Stmt *DiagnosticStmt, ProgramPoint::Kind K) { assert((K == ProgramPoint::PreStmtPurgeDeadSymbolsKind || - ReferenceStmt == 0) + ReferenceStmt == 0 || isa<ReturnStmt>(ReferenceStmt)) && "PostStmt is not generally supported by the SymbolReaper yet"); + assert(LC && "Must pass the current (or expiring) LocationContext"); + + if (!DiagnosticStmt) { + DiagnosticStmt = ReferenceStmt; + assert(DiagnosticStmt && "Required for clearing a LocationContext"); + } + NumRemoveDeadBindings++; CleanedState = Pred->getState(); - SymbolReaper SymReaper(LC, ReferenceStmt, SymMgr, getStoreManager()); + + // LC is the location context being destroyed, but SymbolReaper wants a + // location context that is still live. (If this is the top-level stack + // frame, this will be null.) + if (!ReferenceStmt) { + assert(K == ProgramPoint::PostStmtPurgeDeadSymbolsKind && + "Use PostStmtPurgeDeadSymbolsKind for clearing a LocationContext"); + LC = LC->getParent(); + } + + const StackFrameContext *SFC = LC ? LC->getCurrentStackFrame() : 0; + SymbolReaper SymReaper(SFC, ReferenceStmt, SymMgr, getStoreManager()); getCheckerManager().runCheckersForLiveSymbols(CleanedState, SymReaper); // Create a state in which dead bindings are removed from the environment // and the store. TODO: The function should just return new env and store, // not a new state. - const StackFrameContext *SFC = LC->getCurrentStackFrame(); CleanedState = StateMgr.removeDeadBindings(CleanedState, SFC, SymReaper); // Process any special transfer function for dead symbols. @@ -345,8 +362,7 @@ void ExprEngine::ProcessStmt(const CFGStmt S, EntryNode = Pred; ExplodedNodeSet CleanedStates; if (shouldRemoveDeadBindings(AMgr, S, Pred, EntryNode->getLocationContext())){ - removeDead(EntryNode, CleanedStates, currStmt, - Pred->getStackFrame(), currStmt); + removeDead(EntryNode, CleanedStates, currStmt, Pred->getLocationContext()); } else CleanedStates.Add(EntryNode); diff --git a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp index 3ead0817f7..a98e8b4922 100644 --- a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -168,27 +168,24 @@ static SVal adjustReturnValue(SVal V, QualType ExpectedTy, QualType ActualTy, void ExprEngine::removeDeadOnEndOfFunction(NodeBuilderContext& BC, ExplodedNode *Pred, ExplodedNodeSet &Dst) { - NodeBuilder Bldr(Pred, Dst, BC); - // Find the last statement in the function and the corresponding basic block. const Stmt *LastSt = 0; const CFGBlock *Blk = 0; llvm::tie(LastSt, Blk) = getLastStmt(Pred); if (!Blk || !LastSt) { + Dst.Add(Pred); return; } - - // If the last statement is return, everything it references should stay live. - if (isa<ReturnStmt>(LastSt)) - 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 PreStmtPurgeDead point will be associated. - currBldrCtx = &BC; - removeDead(Pred, Dst, 0, 0, LastSt, + // 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, ProgramPoint::PostStmtPurgeDeadSymbolsKind); - currBldrCtx = 0; } static bool wasDifferentDeclUsedForInlining(CallEventRef<> Call, @@ -290,11 +287,11 @@ void ExprEngine::processCallExit(ExplodedNode *CEBNode) { NodeBuilderContext Ctx(getCoreEngine(), Blk, BindedRetNode); currBldrCtx = &Ctx; - // Here, we call the Symbol Reaper with 0 statement and caller location + // 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 it's children). We use LastStmt as a diagnostic statement, which - // which the PreStmtPurge Dead point will be associated. - removeDead(BindedRetNode, CleanedNodes, 0, callerCtx, LastSt, + // (and its children). We use LastSt as a diagnostic statement, which + // which the program point will be associated. + removeDead(BindedRetNode, CleanedNodes, 0, calleeCtx, LastSt, ProgramPoint::PostStmtPurgeDeadSymbolsKind); currBldrCtx = 0; } else { diff --git a/test/Analysis/malloc-plist.c b/test/Analysis/malloc-plist.c index 12430a6ffb..a99e34f426 100644 --- a/test/Analysis/malloc-plist.c +++ b/test/Analysis/malloc-plist.c @@ -235,7 +235,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Assuming 'in' is > 5</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Assuming 'in' is > 5</string> +// CHECK-NEXT: <string>Assuming 'in' is > 5</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -332,7 +332,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is allocated</string> +// CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -380,7 +380,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'p'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'p'</string> +// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'p'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: <key>description</key><string>Memory is never released; potential leak of memory pointed to by 'p'</string> @@ -494,7 +494,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is allocated</string> +// CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -517,13 +517,13 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>end</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>22</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>21</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>22</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>21</integer> +// CHECK-NEXT: <key>col</key><integer>5</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -534,15 +534,15 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>kind</key><string>event</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>22</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>21</integer> +// CHECK-NEXT: <key>col</key><integer>5</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <key>depth</key><integer>0</integer> // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'A'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'A'</string> +// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'A'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: <key>description</key><string>Memory is never released; potential leak of memory pointed to by 'A'</string> @@ -550,11 +550,11 @@ void use_function_with_leak7() { // 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>4</integer> +// CHECK-NEXT: <key>issue_hash</key><integer>3</integer> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>22</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>21</integer> +// CHECK-NEXT: <key>col</key><integer>5</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </dict> @@ -622,7 +622,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is allocated</string> +// CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -719,7 +719,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Attempt to reallocate memory</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Attempt to reallocate memory</string> +// CHECK-NEXT: <string>Attempt to reallocate memory</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -816,7 +816,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Assuming 'tmp' is null</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Assuming 'tmp' is null</string> +// CHECK-NEXT: <string>Assuming 'tmp' is null</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -879,7 +879,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Reallocation failed</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Reallocation failed</string> +// CHECK-NEXT: <string>Reallocation failed</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -927,7 +927,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> +// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: <key>description</key><string>Memory is never released; potential leak of memory pointed to by 'buf'</string> @@ -1007,7 +1007,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Calling 'wrapper'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Calling 'wrapper'</string> +// CHECK-NEXT: <string>Calling 'wrapper'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>event</string> @@ -1021,7 +1021,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Entered call from 'test_wrapper'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Entered call from 'test_wrapper'</string> +// CHECK-NEXT: <string>Entered call from 'test_wrapper'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1118,7 +1118,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is allocated</string> +// CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1215,7 +1215,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Assuming 'x' is non-null</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Assuming 'x' is non-null</string> +// CHECK-NEXT: <string>Assuming 'x' is non-null</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1278,7 +1278,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Returned allocated memory</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Returned allocated memory</string> +// CHECK-NEXT: <string>Returned allocated memory</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1301,13 +1301,13 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>end</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>46</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>45</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>46</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>45</integer> +// CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -1318,15 +1318,15 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>kind</key><string>event</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>46</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>45</integer> +// CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <key>depth</key><integer>0</integer> // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> +// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: <key>description</key><string>Memory is never released; potential leak of memory pointed to by 'buf'</string> @@ -1334,11 +1334,11 @@ void use_function_with_leak7() { // 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>3</integer> +// CHECK-NEXT: <key>issue_hash</key><integer>2</integer> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>46</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer>45</integer> +// CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </dict> @@ -1406,7 +1406,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Calling 'my_malloc_and_free'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Calling 'my_malloc_and_free'</string> +// CHECK-NEXT: <string>Calling 'my_malloc_and_free'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>event</string> @@ -1420,7 +1420,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Entered call from 'test_double_action_call'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Entered call from 'test_double_action_call'</string> +// CHECK-NEXT: <string>Entered call from 'test_double_action_call'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1517,7 +1517,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is allocated</string> +// CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1614,7 +1614,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Calling 'my_free'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Calling 'my_free'</string> +// CHECK-NEXT: <string>Calling 'my_free'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>event</string> @@ -1628,7 +1628,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Entered call from 'my_malloc_and_free'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Entered call from 'my_malloc_and_free'</string> +// CHECK-NEXT: <string>Entered call from 'my_malloc_and_free'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1691,7 +1691,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is released</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is released</string> +// CHECK-NEXT: <string>Memory is released</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>event</string> @@ -1720,7 +1720,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Returned released memory via 1st parameter</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Returned released memory via 1st parameter</string> +// CHECK-NEXT: <string>Returned released memory via 1st parameter</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1783,7 +1783,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Returned released memory via 1st parameter</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Returned released memory via 1st parameter</string> +// CHECK-NEXT: <string>Returned released memory via 1st parameter</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1846,7 +1846,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Use of memory after it is freed</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Use of memory after it is freed</string> +// CHECK-NEXT: <string>Use of memory after it is freed</string> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: <key>description</key><string>Use of memory after it is freed</string> @@ -1926,7 +1926,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is allocated</string> +// CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -1989,7 +1989,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Calling 'my_realloc'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Calling 'my_realloc'</string> +// CHECK-NEXT: <string>Calling 'my_realloc'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>event</string> @@ -2003,7 +2003,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Entered call from 'reallocIntra'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Entered call from 'reallocIntra'</string> +// CHECK-NEXT: <string>Entered call from 'reallocIntra'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -2134,7 +2134,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Attempt to reallocate memory</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Attempt to reallocate memory</string> +// CHECK-NEXT: <string>Attempt to reallocate memory</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -2231,7 +2231,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Assuming 'tmp' is null</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Assuming 'tmp' is null</string> +// CHECK-NEXT: <string>Assuming 'tmp' is null</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -2294,7 +2294,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Reallocation failed</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Reallocation failed</string> +// CHECK-NEXT: <string>Reallocation failed</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -2357,7 +2357,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Reallocation of 1st parameter failed</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Reallocation of 1st parameter failed</string> +// CHECK-NEXT: <string>Reallocation of 1st parameter failed</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -2405,7 +2405,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> +// CHECK-NEXT: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: <key>description</key><string>Memory is never released; potential leak of memory pointed to by 'buf'</string> @@ -2485,7 +2485,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Calling 'malloc_wrapper_ret'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Calling 'malloc_wrapper_ret'</string> +// CHECK-NEXT: <string>Calling 'malloc_wrapper_ret'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>event</string> @@ -2499,7 +2499,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Entered call from 'use_ret'</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Entered call from 'use_ret'</string> +// CHECK-NEXT: <string>Entered call from 'use_ret'</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> @@ -2596,7 +2596,7 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Memory is allocated</string> +// CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>event</string> @@ -2625,7 +2625,41 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Returned allocated memory</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Returned allocated memory</string> +// 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>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> @@ -2648,13 +2682,13 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>end</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>87</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// 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>87</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// 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> @@ -2665,15 +2699,15 @@ void use_function_with_leak7() { // CHECK-NEXT: <key>kind</key><string>event</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>87</integer> -// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>line</key><integer&g |