diff options
author | Anna Zaks <ganna@apple.com> | 2012-02-16 22:26:07 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2012-02-16 22:26:07 +0000 |
commit | fe571608b925079227d053a459eca86f7408e5c6 (patch) | |
tree | 05ec75ea26fa4fca38c5ee3db0987a8bcd51e35f | |
parent | ebc6af1279178e1d5f4dcd9f1bbf0f06d89e3a53 (diff) |
[analyzer] Malloc Checker: Make the diagnostic visitor handle the case
of failing realloc. + Minor cleanups.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150732 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 96 | ||||
-rw-r--r-- | test/Analysis/malloc-plist.c | 466 |
2 files changed, 493 insertions, 69 deletions
diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index a14057980f..044db28400 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -184,11 +184,18 @@ private: /// region. class MallocBugVisitor : public BugReporterVisitor { protected: + enum NotificationMode { + Normal, + Complete, + ReallocationFailed + }; + // The allocated region symbol tracked by the main analysis. SymbolRef Sym; + NotificationMode Mode; public: - MallocBugVisitor(SymbolRef S) : Sym(S) {} + MallocBugVisitor(SymbolRef S) : Sym(S), Mode(Normal) {} virtual ~MallocBugVisitor() {} void Profile(llvm::FoldingSetNodeID &ID) const { @@ -197,14 +204,28 @@ private: ID.AddPointer(Sym); } - inline bool isAllocated(const RefState *S, const RefState *SPrev) { + inline bool isAllocated(const RefState *S, const RefState *SPrev, + const Stmt *Stmt) { // Did not track -> allocated. Other state (released) -> allocated. - return ((S && S->isAllocated()) && (!SPrev || !SPrev->isAllocated())); + return (Stmt && isa<CallExpr>(Stmt) && + (S && S->isAllocated()) && (!SPrev || !SPrev->isAllocated())); } - inline bool isReleased(const RefState *S, const RefState *SPrev) { + inline bool isReleased(const RefState *S, const RefState *SPrev, + const Stmt *Stmt) { // Did not track -> released. Other state (allocated) -> released. - return ((S && S->isReleased()) && (!SPrev || !SPrev->isReleased())); + return (Stmt && isa<CallExpr>(Stmt) && + (S && S->isReleased()) && (!SPrev || !SPrev->isReleased())); + } + + inline bool isReallocFailedCheck(const RefState *S, const RefState *SPrev, + const Stmt *Stmt) { + // If the expression is not a call, and the state change is + // released -> allocated, it must be the realloc return value + // check. If we have to handle more cases here, it might be cleaner just + // to track this extra bit in the state itself. + return ((!Stmt || !isa<CallExpr>(Stmt)) && + (S && S->isAllocated()) && (SPrev && !SPrev->isAllocated())); } PathDiagnosticPiece *VisitNode(const ExplodedNode *N, @@ -502,6 +523,7 @@ ProgramStateRef MallocChecker::FreeMemAux(CheckerContext &C, "Try to free a memory block that has been released")); BugReport *R = new BugReport(*BT_DoubleFree, BT_DoubleFree->getDescription(), N); + R->addRange(ArgExpr->getSourceRange()); R->addVisitor(new MallocBugVisitor(Sym)); C.EmitReport(R); } @@ -861,11 +883,11 @@ void MallocChecker::checkPreStmt(const ReturnStmt *S, CheckerContext &C) const { return; // Check if we are returning freed memory. - if (checkUseAfterFree(Sym, C, S)) + if (checkUseAfterFree(Sym, C, E)) return; // Check if the symbol is escaping. - checkEscape(Sym, S, C); + checkEscape(Sym, E, C); } bool MallocChecker::checkUseAfterFree(SymbolRef Sym, CheckerContext &C, @@ -1051,28 +1073,58 @@ MallocChecker::MallocBugVisitor::VisitNode(const ExplodedNode *N, if (!RS && !RSPrev) return 0; - // We expect the interesting locations be StmtPoints corresponding to call - // expressions. We do not support indirect function calls as of now. - const CallExpr *CE = 0; - if (isa<StmtPoint>(N->getLocation())) - CE = dyn_cast<CallExpr>(cast<StmtPoint>(N->getLocation()).getStmt()); - if (!CE) - return 0; - const FunctionDecl *funDecl = CE->getDirectCallee(); - if (!funDecl) + const Stmt *S = 0; + const char *Msg = 0; + + // Retrieve the associated statement. + ProgramPoint ProgLoc = N->getLocation(); + if (isa<StmtPoint>(ProgLoc)) + S = cast<StmtPoint>(ProgLoc).getStmt(); + // If an assumption was made on a branch, it should be caught + // here by looking at the state transition. + if (isa<BlockEdge>(ProgLoc)) { + const CFGBlock *srcBlk = cast<BlockEdge>(ProgLoc).getSrc(); + S = srcBlk->getTerminator(); + } + if (!S) return 0; // Find out if this is an interesting point and what is the kind. - const char *Msg = 0; - if (isAllocated(RS, RSPrev)) - Msg = "Memory is allocated here"; - else if (isReleased(RS, RSPrev)) - Msg = "Memory is released here"; + if (Mode == Normal) { + if (isAllocated(RS, RSPrev, S)) + Msg = "Memory is allocated"; + else if (isReleased(RS, RSPrev, S)) + Msg = "Memory is released"; + else if (isReallocFailedCheck(RS, RSPrev, S)) { + Mode = ReallocationFailed; + Msg = "Reallocation failed"; + } + + // We are in a special mode if a reallocation failed later in the path. + } else if (Mode == ReallocationFailed) { + // Generate a special diagnostic for the first realloc we find. + if (!isAllocated(RS, RSPrev, S) && !isReleased(RS, RSPrev, S)) + return 0; + + // Check that the name of the function is realloc. + const CallExpr *CE = dyn_cast<CallExpr>(S); + if (!CE) + return 0; + const FunctionDecl *funDecl = CE->getDirectCallee(); + if (!funDecl) + return 0; + StringRef FunName = funDecl->getName(); + if (!(FunName.equals("realloc") || FunName.equals("reallocf"))) + return 0; + Msg = "Attempt to reallocate memory"; + Mode = Normal; + } + if (!Msg) return 0; // Generate the extra diagnostic. - PathDiagnosticLocation Pos(CE, BRC.getSourceManager(), + PathDiagnosticLocation Pos(S, BRC.getSourceManager(), N->getLocationContext()); return new PathDiagnosticEventPiece(Pos, Msg); } diff --git a/test/Analysis/malloc-plist.c b/test/Analysis/malloc-plist.c index 8727bc26c6..2539a28e8b 100644 --- a/test/Analysis/malloc-plist.c +++ b/test/Analysis/malloc-plist.c @@ -2,6 +2,8 @@ typedef __typeof(sizeof(int)) size_t; void *malloc(size_t); +void free(void *); +void *realloc(void *ptr, size_t size); void diagnosticTest(int in) { if (in > 5) { @@ -17,12 +19,24 @@ void myArrayAllocation() { A[0] = 0;// expected-warning {{leak}} } +void reallocDiagnostics() { + char * buf = malloc(100); + char * tmp; + tmp = (char*)realloc(buf, 0x1000000); + if (!tmp) { + return;// expected-warning {{leak}} + } + buf = tmp; + free(buf); +} + // CHECK: <?xml version="1.0" encoding="UTF-8"?> // CHECK: <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> // CHECK: <plist version="1.0"> // CHECK: <dict> // CHECK: <key>files</key> // CHECK: <array> +// CHECK: <string>/Users/zaks/workspace/llvmgit/llvm/tools/clang/test/Analysis/malloc-plist.c</string> // CHECK: </array> // CHECK: <key>diagnostics</key> // CHECK: <array> @@ -37,12 +51,12 @@ void myArrayAllocation() { // CHECK: <key>start</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -50,12 +64,12 @@ void myArrayAllocation() { // CHECK: <key>end</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -67,7 +81,7 @@ void myArrayAllocation() { // CHECK: <key>kind</key><string>event</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -75,12 +89,12 @@ void myArrayAllocation() { // CHECK: <array> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>14</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -99,12 +113,12 @@ void myArrayAllocation() { // CHECK: <key>start</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>7</integer> +// CHECK: <key>line</key><integer>9</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -112,12 +126,12 @@ void myArrayAllocation() { // CHECK: <key>end</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -133,12 +147,12 @@ void myArrayAllocation() { // CHECK: <key>start</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -146,12 +160,12 @@ void myArrayAllocation() { // CHECK: <key>end</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>18</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>27</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -163,7 +177,7 @@ void myArrayAllocation() { // CHECK: <key>kind</key><string>event</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>18</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -171,21 +185,21 @@ void myArrayAllocation() { // CHECK: <array> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>18</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>27</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: </array> // CHECK: </array> // CHECK: <key>extended_message</key> -// CHECK: <string>Memory is allocated here</string> +// CHECK: <string>Memory is allocated</string> // CHECK: <key>message</key> -// CHECK: <string>Memory is allocated here</string> +// CHECK: <string>Memory is allocated</string> // CHECK: </dict> // CHECK: <dict> // CHECK: <key>kind</key><string>control</string> @@ -195,12 +209,12 @@ void myArrayAllocation() { // CHECK: <key>start</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>18</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>8</integer> +// CHECK: <key>line</key><integer>10</integer> // CHECK: <key>col</key><integer>27</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -208,12 +222,12 @@ void myArrayAllocation() { // CHECK: <key>end</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>line</key><integer>13</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>line</key><integer>13</integer> // CHECK: <key>col</key><integer>6</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -225,7 +239,7 @@ void myArrayAllocation() { // CHECK: <key>kind</key><string>event</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>line</key><integer>13</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -233,12 +247,12 @@ void myArrayAllocation() { // CHECK: <array> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>line</key><integer>13</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>line</key><integer>13</integer> // CHECK: <key>col</key><integer>6</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -255,7 +269,7 @@ void myArrayAllocation() { // CHECK: <key>type</key><string>Memory leak</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>line</key><integer>13</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -271,12 +285,12 @@ void myArrayAllocation() { // CHECK: <key>start</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>15</integer> +// CHECK: <key>line</key><integer>17</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>15</integer> +// CHECK: <key>line</key><integer>17</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -284,12 +298,12 @@ void myArrayAllocation() { // CHECK: <key>end</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -305,12 +319,12 @@ void myArrayAllocation() { // CHECK: <key>start</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>5</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -318,12 +332,12 @@ void myArrayAllocation() { // CHECK: <key>end</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>30</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -335,7 +349,7 @@ void myArrayAllocation() { // CHECK: <key>kind</key><string>event</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -343,21 +357,21 @@ void myArrayAllocation() { // CHECK: <array> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>30</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: </array> // CHECK: </array> // CHECK: <key>extended_message</key> -// CHECK: <string>Memory is allocated here</string> +// CHECK: <string>Memory is allocated</string> // CHECK: <key>message</key> -// CHECK: <string>Memory is allocated here</string> +// CHECK: <string>Memory is allocated</string> // CHECK: </dict> // CHECK: <dict> // CHECK: <key>kind</key><string>control</string> @@ -367,12 +381,12 @@ void myArrayAllocation() { // CHECK: <key>start</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>9</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>16</integer> +// CHECK: <key>line</key><integer>18</integer> // CHECK: <key>col</key><integer>30</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -380,12 +394,12 @@ void myArrayAllocation() { // CHECK: <key>end</key> // CHECK: <array> // CHECK: <dict> -// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>line</key><integer>20</integer> // CHECK: <key>col</key><integer>1</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: <dict> -// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>line</key><integer>20</integer> // CHECK: <key>col</key><integer>1</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -397,7 +411,7 @@ void myArrayAllocation() { // CHECK: <key>kind</key><string>event</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>line</key><integer>20</integer> // CHECK: <key>col</key><integer>1</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> @@ -412,11 +426,369 @@ void myArrayAllocation() { // CHECK: <key>type</key><string>Memory leak</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>line</key><integer>20</integer> // CHECK: <key>col</key><integer>1</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> // CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>path</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>28</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>28</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Memory is allocated</string> +// CHECK: <key>message</key> +// CHECK: <string>Memory is allocated</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>28</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Attempt to reallocate memory</string> +// CHECK: <key>message</key> +// CHECK: <string>Attempt to reallocate memory</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>25</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Reallocation failed</string> +// CHECK: <key>message</key> +// CHECK: <string>Reallocation failed</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Assuming 'tmp' is null</string> +// CHECK: <key>message</key> +// CHECK: <string>Assuming 'tmp' is null</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>26</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>14</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>14</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Allocated memory never released. Potential memory leak</string> +// CHECK: <key>message</key> +// CHECK: <string>Allocated memory never released. Potential memory leak</string> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>description</key><string>Allocated memory never released. Potential memory leak</string> +// CHECK: <key>category</key><string>Logic error</string> +// CHECK: <key>type</key><string>Memory leak</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </dict> // CHECK: </array> // CHECK: </dict> // CHECK: </plist> |