================ @@ -0,0 +1,198 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify=expected,default %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config legacy-inlining-prevention=false -verify=expected,disabled %s + +int getNum(void); // Get an opaque number. + +void clang_analyzer_numTimesReached(void); +void clang_analyzer_dump(int arg); + +//----------------------------------------------------------------------------- +// Simple case: inlined function never reaches `analyzer-max-loop`. + +int inner_simple(void) { + clang_analyzer_numTimesReached(); // expected-warning {{2}} + return 42; +} + +int outer_simple(void) { + int x = inner_simple(); + int y = inner_simple(); + return 53 / (x - y); // expected-warning {{Division by zero}} +} + +//----------------------------------------------------------------------------- +// Inlined function always reaches `analyzer-max-loop`. + +int inner_fixed_loop_1(void) { + int i; + clang_analyzer_numTimesReached(); // expected-warning {{1}} + for (i = 0; i < 10; i++); + clang_analyzer_numTimesReached(); // no-warning + return 42; +} + +int outer_fixed_loop_1(void) { + int x = inner_fixed_loop_1(); + int y = inner_fixed_loop_1(); + return 53 / (x - y); // no-warning +} + +//----------------------------------------------------------------------------- +// Inlined function always reaches `analyzer-max-loop`; inlining is prevented +// even for different entry points. +// This test uses `clang_analyzer_dump` and distinct `arg` values because +// `clang_analyzer_numTimesReached` only counts the paths reaching that node +// during the analysis of one particular entry point, so it cannot distinguish +// "two entry points reached this, both with one path" (where the two reports +// are unified as duplicates by the generic report postprocessing) and "one +// entry point reached this with one path" (where naturally nothing shows that +// the second entry point _tried_ to reach it). + +int inner_fixed_loop_2(int arg) { + // Identical copy of inner_fixed_loop_1 + int i; + clang_analyzer_dump(arg); // expected-warning {{2}} + for (i = 0; i < 10; i++); + clang_analyzer_dump(arg); // no-warning ---------------- balazs-benics-sonarsource wrote:
FIXME. https://github.com/llvm/llvm-project/pull/136720 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits