diff options
-rw-r--r-- | lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 32 | ||||
-rw-r--r-- | test/Analysis/malloc-plist.c | 150 |
2 files changed, 24 insertions, 158 deletions
diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 1415184033..4df77a845e 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -210,15 +210,17 @@ private: // The allocated region symbol tracked by the main analysis. SymbolRef Sym; - // The mode we are in, i.e. what kind of diagnostics will be emitted. - NotificationMode Mode; + // The mode we are in, i.e. what kind of diagnostics will be emitted. + NotificationMode Mode; - // A symbol from when the primary region should have been reallocated. - SymbolRef FailedReallocSymbol; + // A symbol from when the primary region should have been reallocated. + SymbolRef FailedReallocSymbol; - public: - MallocBugVisitor(SymbolRef S) - : Sym(S), Mode(Normal), FailedReallocSymbol(0) {} + bool IsLeak; + + public: + MallocBugVisitor(SymbolRef S, bool isLeak = false) + : Sym(S), Mode(Normal), FailedReallocSymbol(0), IsLeak(isLeak) {} virtual ~MallocBugVisitor() {} @@ -256,6 +258,20 @@ private: const ExplodedNode *PrevN, BugReporterContext &BRC, BugReport &BR); + + PathDiagnosticPiece* getEndPath(BugReporterContext &BRC, + const ExplodedNode *EndPathNode, + BugReport &BR) { + if (!IsLeak) + return 0; + + PathDiagnosticLocation L = + PathDiagnosticLocation::createEndOfPath(EndPathNode, + BRC.getSourceManager()); + // Do not add the statement itself as a range in case of leak. + return new PathDiagnosticEventPiece(L, BR.getDescription(), false); + } + private: class StackHintGeneratorForReallocationFailed : public StackHintGeneratorForSymbol { @@ -895,7 +911,7 @@ void MallocChecker::reportLeak(SymbolRef Sym, ExplodedNode *N, BugReport *R = new BugReport(*BT_Leak, os.str(), N, LocUsedForUniqueing); R->markInteresting(Sym); - R->addVisitor(new MallocBugVisitor(Sym)); + R->addVisitor(new MallocBugVisitor(Sym, true)); C.EmitReport(R); } diff --git a/test/Analysis/malloc-plist.c b/test/Analysis/malloc-plist.c index 8a36ab3085..248abc21c8 100644 --- a/test/Analysis/malloc-plist.c +++ b/test/Analysis/malloc-plist.c @@ -350,21 +350,6 @@ void use_function_with_leak7() { //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>14</integer> -//CHECK: <key>col</key><integer>5</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>14</integer> -//CHECK: <key>col</key><integer>6</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>0</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'p'</string> @@ -910,21 +895,6 @@ void use_function_with_leak7() { //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>28</integer> -//CHECK: <key>col</key><integer>9</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>28</integer> -//CHECK: <key>col</key><integer>14</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>0</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> @@ -2400,21 +2370,6 @@ void use_function_with_leak7() { //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>76</integer> -//CHECK: <key>col</key><integer>5</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>76</integer> -//CHECK: <key>col</key><integer>13</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>0</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'buf'</string> @@ -2843,21 +2798,6 @@ void use_function_with_leak7() { //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>97</integer> -//CHECK: <key>col</key><integer>5</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>97</integer> -//CHECK: <key>col</key><integer>8</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>0</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'm'</string> @@ -3062,21 +3002,6 @@ void use_function_with_leak7() { //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>102</integer> -//CHECK: <key>col</key><integer>5</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>102</integer> -//CHECK: <key>col</key><integer>11</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>1</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'x'</string> @@ -3281,21 +3206,6 @@ void use_function_with_leak7() { //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>111</integer> -//CHECK: <key>col</key><integer>5</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>111</integer> -//CHECK: <key>col</key><integer>9</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>1</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'x'</string> @@ -3568,21 +3478,6 @@ void use_function_with_leak7() { //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>120</integer> -//CHECK: <key>col</key><integer>9</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>120</integer> -//CHECK: <key>col</key><integer>9</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>1</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'x'</string> @@ -3855,21 +3750,6 @@ void use_function_with_leak7() { //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>131</integer> -//CHECK: <key>col</key><integer>9</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>131</integer> -//CHECK: <key>col</key><integer>9</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>1</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'x'</string> @@ -4074,21 +3954,6 @@ void use_function_with_leak7() { //CHECK: <key>col</key><integer>12</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>142</integer> -//CHECK: <key>col</key><integer>12</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>142</integer> -//CHECK: <key>col</key><integer>29</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>1</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'x'</string> @@ -4293,21 +4158,6 @@ void use_function_with_leak7() { //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>153</integer> -//CHECK: <key>col</key><integer>5</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: <dict> -//CHECK: <key>line</key><integer>153</integer> -//CHECK: <key>col</key><integer>23</integer> -//CHECK: <key>file</key><integer>0</integer> -//CHECK: </dict> -//CHECK: </array> -//CHECK: </array> //CHECK: <key>depth</key><integer>1</integer> //CHECK: <key>extended_message</key> //CHECK: <string>Memory is never released; potential leak of memory pointed to by 'x'</string> |