mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 19:49:36 +00:00
[analyzer] Prevent AnalyzerStatsChecker from crash
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. Differential Revision: https://reviews.llvm.org/D42266 llvm-svn: 325693
This commit is contained in:
parent
36362692b3
commit
5184fae04e
@ -122,6 +122,8 @@ void AnalyzerStatsChecker::checkEndAnalysis(ExplodedGraph &G,
|
||||
E = CE.blocks_exhausted_end(); I != E; ++I) {
|
||||
const BlockEdge &BE = I->first;
|
||||
const CFGBlock *Exit = BE.getDst();
|
||||
if (Exit->empty())
|
||||
continue;
|
||||
const CFGElement &CE = Exit->front();
|
||||
if (Optional<CFGStmt> CS = CE.getAs<CFGStmt>()) {
|
||||
SmallString<128> bufI;
|
||||
|
@ -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 @@ int test() { // expected-warning-re{{test -> Total CFGBlocks: {{[0-9]+}} | Unrea
|
||||
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++;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user