| // RUN: %clang_analyze_cc1 -verify %s -analyzer-config eagerly-assume=false \ | |
| // RUN: -analyzer-checker=core,debug.ExprInspection | |
| void clang_analyzer_eval(bool); | |
| void element_constant() { | |
| char arr[10]; | |
| clang_analyzer_eval(arr + 1 > arr); // expected-warning{{TRUE}} | |
| } | |
| void element_known() { | |
| char arr[10]; | |
| int off = 1; | |
| clang_analyzer_eval(arr + off > arr); // expected-warning{{TRUE}} | |
| } | |
| void element_constrained(int off) { | |
| char arr[10]; | |
| if (off == 1) { | |
| clang_analyzer_eval(arr + off > arr); // expected-warning{{TRUE}} | |
| } | |
| } | |
| void element_unknown(int off) { | |
| char arr[10]; | |
| clang_analyzer_eval(arr + off > arr); // expected-warning{{UNKNOWN}} | |
| } | |
| void element_complex(int off) { | |
| char arr[10]; | |
| int comp = off * 2; | |
| if (off == 1) { | |
| clang_analyzer_eval(arr + comp); // expected-warning{{TRUE}} | |
| } | |
| } | |
| void base_constant(int *arr) { | |
| clang_analyzer_eval(arr + 1 > arr); // expected-warning{{TRUE}} | |
| } | |
| void base_known(int *arr) { | |
| int off = 1; | |
| clang_analyzer_eval(arr + off > arr); // expected-warning{{TRUE}} | |
| } | |
| void base_constrained(int *arr, int off) { | |
| if (off == 1) { | |
| clang_analyzer_eval(arr + off > arr); // expected-warning{{TRUE}} | |
| } | |
| } | |
| void base_unknown(int *arr, int off) { | |
| clang_analyzer_eval(arr + off > arr); // expected-warning{{UNKNOWN}} | |
| } | |
| void base_complex(int *arr, int off) { | |
| int comp = off * 2; | |
| if (off == 1) { | |
| clang_analyzer_eval(arr + comp > arr); // expected-warning{{TRUE}} | |
| } | |
| } |