[PATCH] D42266: [analyzer] Prevent AnalyzerStatsChecker from crash
This revision was automatically updated to reflect the committed changes. Closed by commit rC325693: [analyzer] Prevent AnalyzerStatsChecker from crash (authored by szepet, committed by ). Changed prior to commit: https://reviews.llvm.org/D42266?vs=130501=135266#toc Repository: rC Clang https://reviews.llvm.org/D42266 Files: lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp test/Analysis/analyzer-stats.c Index: test/Analysis/analyzer-stats.c === --- test/Analysis/analyzer-stats.c +++ test/Analysis/analyzer-stats.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks -analyzer-max-loop 4 %s int foo(); @@ -12,3 +12,19 @@ a /= 4; return a; } + + +int sink() // expected-warning-re{{sink -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 1 | Exhausted Block: yes | Empty WorkList: yes}} +{ + for (int i = 0; i < 10; ++i) // expected-warning {{(sink): The analyzer generated a sink at this point}} +++i; + + return 0; +} + +int emptyConditionLoop() // expected-warning-re{{emptyConditionLoop -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 0 | Exhausted Block: yes | Empty WorkList: yes}} +{ + int num = 1; + for (;;) +num++; +} Index: lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp === --- lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp +++ lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp @@ -122,6 +122,8 @@ E = CE.blocks_exhausted_end(); I != E; ++I) { const BlockEdge = I->first; const CFGBlock *Exit = BE.getDst(); +if (Exit->empty()) + continue; const CFGElement = Exit->front(); if (Optional CS = CE.getAs()) { SmallString<128> bufI; Index: test/Analysis/analyzer-stats.c === --- test/Analysis/analyzer-stats.c +++ test/Analysis/analyzer-stats.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks -analyzer-max-loop 4 %s int foo(); @@ -12,3 +12,19 @@ a /= 4; return a; } + + +int sink() // expected-warning-re{{sink -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 1 | Exhausted Block: yes | Empty WorkList: yes}} +{ + for (int i = 0; i < 10; ++i) // expected-warning {{(sink): The analyzer generated a sink at this point}} +++i; + + return 0; +} + +int emptyConditionLoop() // expected-warning-re{{emptyConditionLoop -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 0 | Exhausted Block: yes | Empty WorkList: yes}} +{ + int num = 1; + for (;;) +num++; +} Index: lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp === --- lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp +++ lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp @@ -122,6 +122,8 @@ E = CE.blocks_exhausted_end(); I != E; ++I) { const BlockEdge = I->first; const CFGBlock *Exit = BE.getDst(); +if (Exit->empty()) + continue; const CFGElement = Exit->front(); if (Optional CS = CE.getAs()) { SmallString<128> bufI; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D42266: [analyzer] Prevent AnalyzerStatsChecker from crash
NoQ accepted this revision. NoQ added a subscriber: george.karpenkov. NoQ added a comment. This revision is now accepted and ready to land. Herald added a reviewer: george.karpenkov. LGTM! @george.karpenkov has also tested that when he was gathering statistics about his traversal order improvements and it helped :) Repository: rC Clang https://reviews.llvm.org/D42266 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D42266: [analyzer] Prevent AnalyzerStatsChecker from crash
szepet added a comment. > Would it make sense to use the last element of the block edge's source for > the diagnostic location when the destination block is empty? I do not think so. In the testfile `emptyConditionLoop` function is a great counter example since the last element of the source block is the `num = 1` which would not make sense (in my opinion). However, in this case the location of the terminator statement could be used (if there is any). If you are OK with that solution, I can update the patch. Repository: rC Clang https://reviews.llvm.org/D42266 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D42266: [analyzer] Prevent AnalyzerStatsChecker from crash
dcoughlin added a comment. This seems reasonable. Would it make sense to use the last element of the block edge's source for the diagnostic location when the destination block is empty? Repository: rC Clang https://reviews.llvm.org/D42266 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D42266: [analyzer] Prevent AnalyzerStatsChecker from crash
szepet created this revision. szepet added reviewers: NoQ, dcoughlin, xazax.hun. Herald added subscribers: dkrupp, a.sidorin, rnkovacs, baloghadamsoftware, whisperity. The checker marks the locations where the analyzer creates sinks. However, it can happen that the sink was created because of a loop which does not contain condition statement, only breaks in the body. The `exhausted block` is the block which should contain the condition but empty, in this case. This change only emits this marking in order to avoid the undefined behavior. Repository: rC Clang https://reviews.llvm.org/D42266 Files: lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp test/Analysis/analyzer-stats.c Index: test/Analysis/analyzer-stats.c === --- test/Analysis/analyzer-stats.c +++ test/Analysis/analyzer-stats.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks -analyzer-max-loop 4 %s int foo(); @@ -12,3 +12,19 @@ a /= 4; return a; } + + +int sink() // expected-warning-re{{sink -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 1 | Exhausted Block: yes | Empty WorkList: yes}} +{ + for (int i = 0; i < 10; ++i) // expected-warning {{(sink): The analyzer generated a sink at this point}} +++i; + + return 0; +} + +int emptyConditionLoop() // expected-warning-re{{emptyConditionLoop -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 0 | Exhausted Block: yes | Empty WorkList: yes}} +{ + int num = 1; + for (;;) +num++; +} Index: lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp === --- lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp +++ lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp @@ -122,6 +122,8 @@ E = CE.blocks_exhausted_end(); I != E; ++I) { const BlockEdge = I->first; const CFGBlock *Exit = BE.getDst(); +if (Exit->empty()) + continue; const CFGElement = Exit->front(); if (Optional CS = CE.getAs()) { SmallString<128> bufI; Index: test/Analysis/analyzer-stats.c === --- test/Analysis/analyzer-stats.c +++ test/Analysis/analyzer-stats.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,deadcode.DeadStores,debug.Stats -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks -analyzer-max-loop 4 %s int foo(); @@ -12,3 +12,19 @@ a /= 4; return a; } + + +int sink() // expected-warning-re{{sink -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 1 | Exhausted Block: yes | Empty WorkList: yes}} +{ + for (int i = 0; i < 10; ++i) // expected-warning {{(sink): The analyzer generated a sink at this point}} +++i; + + return 0; +} + +int emptyConditionLoop() // expected-warning-re{{emptyConditionLoop -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 0 | Exhausted Block: yes | Empty WorkList: yes}} +{ + int num = 1; + for (;;) +num++; +} Index: lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp === --- lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp +++ lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp @@ -122,6 +122,8 @@ E = CE.blocks_exhausted_end(); I != E; ++I) { const BlockEdge = I->first; const CFGBlock *Exit = BE.getDst(); +if (Exit->empty()) + continue; const CFGElement = Exit->front(); if (Optional CS = CE.getAs()) { SmallString<128> bufI; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits