// RUN: %clang_analyze_cc1 %s \
// RUN: -analyzer-checker=core \
// RUN: -analyzer-checker=unix.StdCLibraryFunctions \
// RUN: -analyzer-checker=debug.StdCLibraryFunctionsTester \
// RUN: -analyzer-config unix.StdCLibraryFunctions:DisplayLoadedSummaries=true \
// RUN: -analyzer-checker=debug.ExprInspection \
// RUN: -analyzer-config eagerly-assume=false \
// RUN: -triple i686-unknown-linux \
// RUN: -analyzer-output=text \
// RUN: -verify
template <typename T>
void clang_analyzer_express(T x);
void clang_analyzer_eval(bool);
int clang_analyzer_getExtent(void *);
// Check NotNullConstraint assumption notes.
int __not_null(int *);
int test_not_null_note(int *x, int y) {
__not_null(x); // expected-note{{Assuming that the 1st argument to '__not_null' is not NULL}}
if (x) // expected-note{{'x' is non-null}} \
// expected-note{{Taking true branch}}
if (!y) // expected-note{{Assuming 'y' is 0}} \
// expected-note{{Taking true branch}}
return 1 / y; // expected-warning{{Division by zero}} \
// expected-note{{Division by zero}}
return 0;
}
// Check the RangeConstraint assumption notes.
int __single_val_0(int); // [0, 0]
int test_range_constraint_note(int x, int y) {
__single_val_0(x); // expected-note{{Assuming that the 1st argument to '__single_val_0' is zero}}
return y / x; // expected-warning{{Division by zero}} \
// expected-note{{Division by zero}}
}
// Check the BufferSizeConstraint assumption notes.
int __buf_size_arg_constraint_concrete(const void *buf); // size of buf must be >= 10
void test_buffer_size_note(char *buf, int y) {
__buf_size_arg_constraint_concrete(buf); // expected-note {{Assuming that the 1st argument to '__buf_size_arg_constraint_concrete' is a buffer with size equal to or greater than 10}}
clang_analyzer_eval(clang_analyzer_getExtent(buf) >= 10); // expected-warning{{TRUE}} \
// expected-note{{TRUE}}
// clang_analyzer_express marks the argument as interesting.
clang_analyzer_express(buf); // expected-warning {{}} // the message does not really matter \
// expected-note {{}}
}
int __test_case_note();
int test_case_note_1(int y) {
int x0 = __test_case_note();
int x = __test_case_note(); // expected-note{{Function returns 0}} \
// expected-note{{'x' initialized here}}
return y / x; // expected-warning{{Division by zero}} \
// expected-note{{Division by zero}}
}
int test_case_note_2(int y) {
int x = __test_case_note();
return y / (x - 1); // expected-warning{{Division by zero}} \
// expected-note{{Division by zero}}
}