MTC updated this revision to Diff 120401. MTC marked an inline comment as done. MTC added a comment.
Split the long "expected" line into multiple lines. https://reviews.llvm.org/D37187 Files: lib/StaticAnalyzer/Core/PathDiagnostic.cpp test/Analysis/loop-widening-notes.c Index: test/Analysis/loop-widening-notes.c =================================================================== --- /dev/null +++ test/Analysis/loop-widening-notes.c @@ -0,0 +1,70 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha -analyzer-max-loop 2 -analyzer-config widen-loops=true -analyzer-output=text -verify %s + +int *p_a; +int bar(); +int flag_a; +int test_for_bug_25609() { + if (p_a == 0) // expected-note {{Assuming 'p_a' is equal to null}} + // expected-note@-1 {{Taking true branch}} + bar(); + for (int i = 0; i < flag_a; ++i) {} // expected-note {{Loop condition is true. Entering loop body}} + // expected-note@-1 {{Value assigned to 'p_a'}} + // expected-note@-2 {{Loop condition is false. Execution continues on line 13}} + *p_a = 25609; // no-crash expected-warning {{Dereference of null pointer (loaded from variable 'p_a')}} + // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p_a')}} + return *p_a; +} + +int flag_b; +int while_analyzer_output() { + flag_b = 100; + int num = 10; + while (flag_b-- > 0) { // expected-note {{Loop condition is true. Entering loop body}} + // expected-note@-1 {{Value assigned to 'num'}} + // expected-note@-2 {{Loop condition is false. Execution continues on line 27}} + num = flag_b; + } + if (num < 0) // expected-note {{Assuming 'num' is >= 0}} + // expected-note@-1 {{Taking false branch}} + flag_b = 0; + else if (num >= 1) // expected-note {{Assuming 'num' is < 1}} + // expected-note@-1 {{Taking false branch}} + flag_b = 50; + else + flag_b = 100; + return flag_b / num; // no-crash expected-warning {{Division by zero}} + // expected-note@-1 {{Division by zero}} +} + +int flag_c; +int do_while_analyzer_output() { + int num = 10; + do { // expected-note {{Loop condition is true. Execution continues on line 44}} + // expected-note@-1 {{Loop condition is false. Exiting loop}} + num--; + } while (flag_c-- > 0); //expected-note {{Value assigned to 'num'}} + int local = 0; + if (num == 0) // expected-note {{Assuming 'num' is equal to 0}} + // expected-note@-1 {{Taking true branch}} + local = 10 / num; // no-crash expected-warning {{Division by zero}} + // expected-note@-1 {{Division by zero}} + return local; +} + +int flag_d; +int test_for_loop() { + int num = 10; + int tmp = 0; + for (int i = 0; // expected-note {{Loop condition is true. Entering loop body}} + // expected-note@-1 {{Loop condition is false. Execution continues on line 65}} + ++tmp, // expected-note {{Value assigned to 'num'}} + i < flag_d; + ++i) { + ++num; + } + if (num == 0) // expected-note {{Assuming 'num' is equal to 0}} + // expected-note@-1 {{Taking true branch}} + flag_d += tmp; + return flag_d / num; // no-crash expected-warning {{Division by zero}} + // expected-note@-1 {{Division by zero}} +} Index: lib/StaticAnalyzer/Core/PathDiagnostic.cpp =================================================================== --- lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -690,6 +690,8 @@ return getLocationForCaller(CEE->getCalleeContext(), CEE->getLocationContext(), SMng); + } else if (Optional<BlockEntrance> BE = P.getAs<BlockEntrance>()) { + S = BE->getBlock()->getTerminatorCondition(); } else { llvm_unreachable("Unexpected ProgramPoint"); }
Index: test/Analysis/loop-widening-notes.c =================================================================== --- /dev/null +++ test/Analysis/loop-widening-notes.c @@ -0,0 +1,70 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha -analyzer-max-loop 2 -analyzer-config widen-loops=true -analyzer-output=text -verify %s + +int *p_a; +int bar(); +int flag_a; +int test_for_bug_25609() { + if (p_a == 0) // expected-note {{Assuming 'p_a' is equal to null}} + // expected-note@-1 {{Taking true branch}} + bar(); + for (int i = 0; i < flag_a; ++i) {} // expected-note {{Loop condition is true. Entering loop body}} + // expected-note@-1 {{Value assigned to 'p_a'}} + // expected-note@-2 {{Loop condition is false. Execution continues on line 13}} + *p_a = 25609; // no-crash expected-warning {{Dereference of null pointer (loaded from variable 'p_a')}} + // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p_a')}} + return *p_a; +} + +int flag_b; +int while_analyzer_output() { + flag_b = 100; + int num = 10; + while (flag_b-- > 0) { // expected-note {{Loop condition is true. Entering loop body}} + // expected-note@-1 {{Value assigned to 'num'}} + // expected-note@-2 {{Loop condition is false. Execution continues on line 27}} + num = flag_b; + } + if (num < 0) // expected-note {{Assuming 'num' is >= 0}} + // expected-note@-1 {{Taking false branch}} + flag_b = 0; + else if (num >= 1) // expected-note {{Assuming 'num' is < 1}} + // expected-note@-1 {{Taking false branch}} + flag_b = 50; + else + flag_b = 100; + return flag_b / num; // no-crash expected-warning {{Division by zero}} + // expected-note@-1 {{Division by zero}} +} + +int flag_c; +int do_while_analyzer_output() { + int num = 10; + do { // expected-note {{Loop condition is true. Execution continues on line 44}} + // expected-note@-1 {{Loop condition is false. Exiting loop}} + num--; + } while (flag_c-- > 0); //expected-note {{Value assigned to 'num'}} + int local = 0; + if (num == 0) // expected-note {{Assuming 'num' is equal to 0}} + // expected-note@-1 {{Taking true branch}} + local = 10 / num; // no-crash expected-warning {{Division by zero}} + // expected-note@-1 {{Division by zero}} + return local; +} + +int flag_d; +int test_for_loop() { + int num = 10; + int tmp = 0; + for (int i = 0; // expected-note {{Loop condition is true. Entering loop body}} + // expected-note@-1 {{Loop condition is false. Execution continues on line 65}} + ++tmp, // expected-note {{Value assigned to 'num'}} + i < flag_d; + ++i) { + ++num; + } + if (num == 0) // expected-note {{Assuming 'num' is equal to 0}} + // expected-note@-1 {{Taking true branch}} + flag_d += tmp; + return flag_d / num; // no-crash expected-warning {{Division by zero}} + // expected-note@-1 {{Division by zero}} +} Index: lib/StaticAnalyzer/Core/PathDiagnostic.cpp =================================================================== --- lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -690,6 +690,8 @@ return getLocationForCaller(CEE->getCalleeContext(), CEE->getLocationContext(), SMng); + } else if (Optional<BlockEntrance> BE = P.getAs<BlockEntrance>()) { + S = BE->getBlock()->getTerminatorCondition(); } else { llvm_unreachable("Unexpected ProgramPoint"); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits