From: Jordy Rose Date: Sun, 18 Mar 2012 07:43:35 +0000 (+0000) Subject: [analyzer] Mark a failed-realloc's result as an interesting symbol between the reallo... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=393f98b5b7f7c950d2b0a7d84501b5dfd00ad780;p=clang [analyzer] Mark a failed-realloc's result as an interesting symbol between the realloc call and the null check, so we get nicer path notes. Fixes a regression introduced by the diagnostic pruning added in r152361. This is accomplished by calling markInteresting /during/ path diagnostic generation, and as such relies on deterministic ordering of BugReporterVisitors -- namely, that BugReporterVisitors are run in /reverse/ order from how they are added. (Right now that's a consequence of storing visitors in an ImmutableList, where new items are added to the front.) It's a little hacky, but it works for now. I think this is the best we can do without storing the relation between the old and new symbols, and that would be a hit whether or not there ends up being an error. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153010 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 133482fcce..99b84897a5 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -846,6 +846,10 @@ void MallocChecker::reportLeak(SymbolRef Sym, ExplodedNode *N, BugReport *R = new BugReport(*BT_Leak, "Memory is never released; potential memory leak", N, LocUsedForUniqueing); R->markInteresting(Sym); + // FIXME: This is a hack to make sure the MallocBugVisitor gets to look at + // the ExplodedNode chain first, in order to mark any failed realloc symbols + // as interesting for ConditionBRVisitor. + R->addVisitor(new ConditionBRVisitor()); R->addVisitor(new MallocBugVisitor(Sym)); C.EmitReport(R); } @@ -1260,13 +1264,31 @@ MallocChecker::checkRegionChanges(ProgramStateRef State, return State; } +static SymbolRef findFailedReallocSymbol(ProgramStateRef currState, + ProgramStateRef prevState) { + ReallocMap currMap = currState->get(); + ReallocMap prevMap = prevState->get(); + + for (ReallocMap::iterator I = prevMap.begin(), E = prevMap.end(); + I != E; ++I) { + SymbolRef sym = I.getKey(); + if (!currMap.lookup(sym)) + return sym; + } + + return NULL; +} + PathDiagnosticPiece * MallocChecker::MallocBugVisitor::VisitNode(const ExplodedNode *N, const ExplodedNode *PrevN, BugReporterContext &BRC, BugReport &BR) { - const RefState *RS = N->getState()->get(Sym); - const RefState *RSPrev = PrevN->getState()->get(Sym); + ProgramStateRef state = N->getState(); + ProgramStateRef statePrev = PrevN->getState(); + + const RefState *RS = state->get(Sym); + const RefState *RSPrev = statePrev->get(Sym); if (!RS && !RSPrev) return 0; @@ -1288,7 +1310,6 @@ MallocChecker::MallocBugVisitor::VisitNode(const ExplodedNode *N, return 0; // Find out if this is an interesting point and what is the kind. - // TODO: Replace 'callee' by the function name. if (Mode == Normal) { if (isAllocated(RS, RSPrev, S)) { Msg = "Memory is allocated"; @@ -1303,6 +1324,9 @@ MallocChecker::MallocBugVisitor::VisitNode(const ExplodedNode *N, Msg = "Reallocation failed"; StackHint = new StackHintGeneratorForReallocationFailed(Sym, "Reallocation failed"); + + if (SymbolRef sym = findFailedReallocSymbol(state, statePrev)) + BR.markInteresting(sym); } // We are in a special mode if a reallocation failed later in the path. diff --git a/test/Analysis/malloc-plist.c b/test/Analysis/malloc-plist.c index d347e5f9fc..2bba7902f3 100644 --- a/test/Analysis/malloc-plist.c +++ b/test/Analysis/malloc-plist.c @@ -24,8 +24,6 @@ void reallocDiagnostics() { char * buf = malloc(100); char * tmp; tmp = (char*)realloc(buf, 0x1000000); - // FIXME: we need a diagnostic for the null check. - // This requires propagating "interesting" for 'tmp'. if (!tmp) { return;// expected-warning {{leak}} } @@ -647,13 +645,47 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line29 +// CHECK: line27 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col6 +// CHECK: line27 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line27 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line27 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line27 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line27 +// CHECK: col12 // CHECK: file0 // CHECK: // CHECK: @@ -664,30 +696,30 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line29 -// CHECK: col5 +// CHECK: line27 +// CHECK: col9 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col5 +// CHECK: line27 +// CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col6 +// CHECK: line27 +// CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message -// CHECK: Reallocation failed +// CHECK: Assuming 'tmp' is null // CHECK: message -// CHECK: Reallocation failed +// CHECK: Assuming 'tmp' is null // CHECK: // CHECK: // CHECK: kindcontrol @@ -697,26 +729,26 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col5 +// CHECK: line27 +// CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col6 +// CHECK: line27 +// CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col9 +// CHECK: line27 +// CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col12 +// CHECK: line27 +// CHECK: col6 // CHECK: file0 // CHECK: // CHECK: @@ -724,6 +756,35 @@ void use_ret() { // CHECK: // CHECK: // CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line27 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: ranges +// CHECK: +// CHECK: +// CHECK: +// CHECK: line27 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line27 +// CHECK: col6 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: depth0 +// CHECK: extended_message +// CHECK: Reallocation failed +// CHECK: message +// CHECK: Reallocation failed +// CHECK: +// CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: @@ -731,25 +792,25 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col9 +// CHECK: line27 +// CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line29 -// CHECK: col12 +// CHECK: line27 +// CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: -// CHECK: line30 +// CHECK: line28 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line30 +// CHECK: line28 // CHECK: col14 // CHECK: file0 // CHECK: @@ -761,7 +822,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line30 +// CHECK: line28 // CHECK: col9 // CHECK: file0 // CHECK: @@ -769,12 +830,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line30 +// CHECK: line28 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line30 +// CHECK: line28 // CHECK: col14 // CHECK: file0 // CHECK: @@ -792,7 +853,7 @@ void use_ret() { // CHECK: typeMemory leak // CHECK: location // CHECK: -// CHECK: line30 +// CHECK: line28 // CHECK: col9 // CHECK: file0 // CHECK: @@ -808,12 +869,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col3 // CHECK: file0 // CHECK: @@ -821,12 +882,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col15 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col15 // CHECK: file0 // CHECK: @@ -838,7 +899,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col15 // CHECK: file0 // CHECK: @@ -846,12 +907,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col15 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col23 // CHECK: file0 // CHECK: @@ -867,7 +928,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line36 +// CHECK: line34 // CHECK: col1 // CHECK: file0 // CHECK: @@ -885,12 +946,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line36 +// CHECK: line34 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line36 +// CHECK: line34 // CHECK: col1 // CHECK: file0 // CHECK: @@ -898,12 +959,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col3 // CHECK: file0 // CHECK: @@ -919,12 +980,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col3 // CHECK: file0 // CHECK: @@ -932,12 +993,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col13 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col23 // CHECK: file0 // CHECK: @@ -949,7 +1010,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col13 // CHECK: file0 // CHECK: @@ -957,12 +1018,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col13 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col23 // CHECK: file0 // CHECK: @@ -982,12 +1043,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col13 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line37 +// CHECK: line35 // CHECK: col23 // CHECK: file0 // CHECK: @@ -995,12 +1056,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col3 // CHECK: file0 // CHECK: @@ -1016,12 +1077,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col3 // CHECK: file0 // CHECK: @@ -1029,12 +1090,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: @@ -1046,7 +1107,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: @@ -1054,12 +1115,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: @@ -1079,12 +1140,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line39 +// CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: @@ -1092,12 +1153,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line40 +// CHECK: line38 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line40 +// CHECK: line38 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1109,7 +1170,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col15 // CHECK: file0 // CHECK: @@ -1117,12 +1178,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col15 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col23 // CHECK: file0 // CHECK: @@ -1142,12 +1203,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col15 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line45 +// CHECK: line43 // CHECK: col23 // CHECK: file0 // CHECK: @@ -1155,12 +1216,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line47 +// CHECK: line45 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line47 +// CHECK: line45 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1172,7 +1233,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line47 +// CHECK: line45 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1188,7 +1249,7 @@ void use_ret() { // CHECK: typeMemory leak // CHECK: location // CHECK: -// CHECK: line47 +// CHECK: line45 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1204,12 +1265,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line61 +// CHECK: line59 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line61 +// CHECK: line59 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1217,12 +1278,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1234,7 +1295,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1242,12 +1303,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col28 // CHECK: file0 // CHECK: @@ -1263,7 +1324,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line54 +// CHECK: line52 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1281,12 +1342,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line54 +// CHECK: line52 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line54 +// CHECK: line52 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1294,12 +1355,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1315,12 +1376,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1328,12 +1389,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col20 // CHECK: file0 // CHECK: @@ -1345,7 +1406,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col10 // CHECK: file0 // CHECK: @@ -1353,12 +1414,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col20 // CHECK: file0 // CHECK: @@ -1378,12 +1439,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line55 +// CHECK: line53 // CHECK: col20 // CHECK: file0 // CHECK: @@ -1391,12 +1452,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line56 +// CHECK: line54 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line56 +// CHECK: line54 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1412,12 +1473,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line56 +// CHECK: line54 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line56 +// CHECK: line54 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1425,12 +1486,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: @@ -1442,7 +1503,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: @@ -1450,12 +1511,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col17 // CHECK: file0 // CHECK: @@ -1471,7 +1532,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line51 +// CHECK: line49 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1489,12 +1550,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line51 +// CHECK: line49 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line51 +// CHECK: line49 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1502,12 +1563,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line52 +// CHECK: line50 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line52 +// CHECK: line50 // CHECK: col11 // CHECK: file0 // CHECK: @@ -1519,7 +1580,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line52 +// CHECK: line50 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1527,12 +1588,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line52 +// CHECK: line50 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line52 +// CHECK: line50 // CHECK: col11 // CHECK: file0 // CHECK: @@ -1548,7 +1609,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: @@ -1556,12 +1617,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col17 // CHECK: file0 // CHECK: @@ -1581,12 +1642,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line57 +// CHECK: line55 // CHECK: col17 // CHECK: file0 // CHECK: @@ -1594,12 +1655,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line58 +// CHECK: line56 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line58 +// CHECK: line56 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1611,7 +1672,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1619,12 +1680,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col28 // CHECK: file0 // CHECK: @@ -1644,12 +1705,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line62 +// CHECK: line60 // CHECK: col28 // CHECK: file0 // CHECK: @@ -1657,12 +1718,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line63 +// CHECK: line61 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line63 +// CHECK: line61 // CHECK: col14 // CHECK: file0 // CHECK: @@ -1674,7 +1735,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line63 +// CHECK: line61 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1682,12 +1743,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line63 +// CHECK: line61 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line63 +// CHECK: line61 // CHECK: col14 // CHECK: file0 // CHECK: @@ -1705,7 +1766,7 @@ void use_ret() { // CHECK: typeUse-after-free // CHECK: location // CHECK: -// CHECK: line63 +// CHECK: line61 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1721,12 +1782,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1734,12 +1795,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col25 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col35 // CHECK: file0 // CHECK: @@ -1751,7 +1812,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col25 // CHECK: file0 // CHECK: @@ -1759,12 +1820,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col25 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col35 // CHECK: file0 // CHECK: @@ -1784,12 +1845,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col25 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line76 +// CHECK: line74 // CHECK: col35 // CHECK: file0 // CHECK: @@ -1797,12 +1858,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col11 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col11 // CHECK: file0 // CHECK: @@ -1814,7 +1875,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col11 // CHECK: file0 // CHECK: @@ -1822,12 +1883,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col11 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col25 // CHECK: file0 // CHECK: @@ -1843,7 +1904,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line67 +// CHECK: line65 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1861,12 +1922,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line67 +// CHECK: line65 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line67 +// CHECK: line65 // CHECK: col1 // CHECK: file0 // CHECK: @@ -1874,12 +1935,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line68 +// CHECK: line66 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line68 +// CHECK: line66 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1895,12 +1956,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line68 +// CHECK: line66 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line68 +// CHECK: line66 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1908,12 +1969,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1929,12 +1990,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col5 // CHECK: file0 // CHECK: @@ -1942,12 +2003,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col40 // CHECK: file0 // CHECK: @@ -1959,7 +2020,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col18 // CHECK: file0 // CHECK: @@ -1967,12 +2028,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col40 // CHECK: file0 // CHECK: @@ -1992,12 +2053,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line69 +// CHECK: line67 // CHECK: col40 // CHECK: file0 // CHECK: @@ -2005,13 +2066,47 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line70 +// CHECK: line68 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col6 +// CHECK: line68 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line68 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line68 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line68 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line68 +// CHECK: col12 // CHECK: file0 // CHECK: // CHECK: @@ -2022,30 +2117,30 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line70 -// CHECK: col5 +// CHECK: line68 +// CHECK: col9 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col5 +// CHECK: line68 +// CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col6 +// CHECK: line68 +// CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth1 // CHECK: extended_message -// CHECK: Reallocation failed +// CHECK: Assuming 'tmp' is null // CHECK: message -// CHECK: Reallocation failed +// CHECK: Assuming 'tmp' is null // CHECK: // CHECK: // CHECK: kindcontrol @@ -2055,26 +2150,26 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col5 +// CHECK: line68 +// CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col6 +// CHECK: line68 +// CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col9 +// CHECK: line68 +// CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col12 +// CHECK: line68 +// CHECK: col6 // CHECK: file0 // CHECK: // CHECK: @@ -2082,6 +2177,35 @@ void use_ret() { // CHECK: // CHECK: // CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line68 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: ranges +// CHECK: +// CHECK: +// CHECK: +// CHECK: line68 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line68 +// CHECK: col6 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: depth1 +// CHECK: extended_message +// CHECK: Reallocation failed +// CHECK: message +// CHECK: Reallocation failed +// CHECK: +// CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: @@ -2089,25 +2213,25 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col9 +// CHECK: line68 +// CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line70 -// CHECK: col12 +// CHECK: line68 +// CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: -// CHECK: line71 +// CHECK: line69 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line71 +// CHECK: line69 // CHECK: col9 // CHECK: file0 // CHECK: @@ -2119,7 +2243,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col11 // CHECK: file0 // CHECK: @@ -2127,12 +2251,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col11 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col25 // CHECK: file0 // CHECK: @@ -2152,12 +2276,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col11 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line77 +// CHECK: line75 // CHECK: col25 // CHECK: file0 // CHECK: @@ -2165,12 +2289,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line78 +// CHECK: line76 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line78 +// CHECK: line76 // CHECK: col13 // CHECK: file0 // CHECK: @@ -2182,7 +2306,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line78 +// CHECK: line76 // CHECK: col5 // CHECK: file0 // CHECK: @@ -2190,12 +2314,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line78 +// CHECK: line76 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line78 +// CHECK: line76 // CHECK: col13 // CHECK: file0 // CHECK: @@ -2213,7 +2337,7 @@ void use_ret() { // CHECK: typeMemory leak // CHECK: location // CHECK: -// CHECK: line78 +// CHECK: line76 // CHECK: col5 // CHECK: file0 // CHECK: @@ -2229,12 +2353,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line86 +// CHECK: line84 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line86 +// CHECK: line84 // CHECK: col5 // CHECK: file0 // CHECK: @@ -2242,12 +2366,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col9 // CHECK: file0 // CHECK: @@ -2259,7 +2383,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col9 // CHECK: file0 // CHECK: @@ -2267,12 +2391,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col28 // CHECK: file0 // CHECK: @@ -2288,7 +2412,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line82 +// CHECK: line80 // CHECK: col1 // CHECK: file0 // CHECK: @@ -2306,12 +2430,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line82 +// CHECK: line80 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line82 +// CHECK: line80 // CHECK: col1 // CHECK: file0 // CHECK: @@ -2319,12 +2443,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col5 // CHECK: file0 // CHECK: @@ -2340,12 +2464,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col5 // CHECK: file0 // CHECK: @@ -2353,12 +2477,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col19 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col28 // CHECK: file0 // CHECK: @@ -2370,7 +2494,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col19 // CHECK: file0 // CHECK: @@ -2378,12 +2502,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col19 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line83 +// CHECK: line81 // CHECK: col28 // CHECK: file0 // CHECK: @@ -2399,7 +2523,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col9 // CHECK: file0 // CHECK: @@ -2407,12 +2531,12 @@ void use_ret() { // CHECK: // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col28 // CHECK: file0 // CHECK: @@ -2432,12 +2556,12 @@ void use_ret() { // CHECK: start // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line87 +// CHECK: line85 // CHECK: col28 // CHECK: file0 // CHECK: @@ -2445,12 +2569,12 @@ void use_ret() { // CHECK: end // CHECK: // CHECK: -// CHECK: line88 +// CHECK: line86 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: -// CHECK: line88 +// CHECK: line86 // CHECK: col1 // CHECK: file0 // CHECK: @@ -2462,7 +2586,7 @@ void use_ret() { // CHECK: kindevent // CHECK: location // CHECK: -// CHECK: line88 +// CHECK: line86 // CHECK: col1 // CHECK: file0 // CHECK: @@ -2478,7 +2602,7 @@ void use_ret() { // CHECK: typeMemory leak // CHECK: location // CHECK: -// CHECK: line88 +// CHECK: line86 // CHECK: col1 // CHECK: file0 // CHECK: