1 // RUN: %clang_analyze_cc1 -analyzer-checker=apiModeling.StdCLibraryFunctions,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s
2 // RUN: %clang_analyze_cc1 -triple i686-unknown-linux -analyzer-checker=apiModeling.StdCLibraryFunctions,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s
3 // RUN: %clang_analyze_cc1 -triple x86_64-unknown-linux -analyzer-checker=apiModeling.StdCLibraryFunctions,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s
4 // RUN: %clang_analyze_cc1 -triple armv7-a15-linux -analyzer-checker=apiModeling.StdCLibraryFunctions,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s
5 // RUN: %clang_analyze_cc1 -triple thumbv7-a15-linux -analyzer-checker=apiModeling.StdCLibraryFunctions,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s
7 void clang_analyzer_eval(int);
11 typedef struct FILE FILE;
15 void test_getc(FILE *fp) {
17 while ((x = getc(fp)) != EOF) {
18 clang_analyzer_eval(x > 255); // expected-warning{{FALSE}}
19 clang_analyzer_eval(x >= 0); // expected-warning{{TRUE}}
24 void test_fgets(FILE *fp) {
25 clang_analyzer_eval(fgetc(fp) < 256); // expected-warning{{TRUE}}
26 clang_analyzer_eval(fgetc(fp) >= 0); // expected-warning{{UNKNOWN}}
30 typedef typeof(sizeof(int)) size_t;
31 typedef signed long ssize_t;
32 ssize_t read(int, void *, size_t);
33 ssize_t write(int, const void *, size_t);
34 void test_read_write(int fd, char *buf) {
36 ssize_t x = write(fd, buf, 10);
37 clang_analyzer_eval(glob); // expected-warning{{UNKNOWN}}
39 clang_analyzer_eval(x <= 10); // expected-warning{{TRUE}}
40 ssize_t y = read(fd, &glob, sizeof(glob));
42 clang_analyzer_eval(y <= sizeof(glob)); // expected-warning{{TRUE}}
44 // -1 overflows on promotion!
45 clang_analyzer_eval(y <= sizeof(glob)); // expected-warning{{FALSE}}
48 clang_analyzer_eval(x == -1); // expected-warning{{TRUE}}
52 size_t fread(void *, size_t, size_t, FILE *);
53 size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict);
54 void test_fread_fwrite(FILE *fp, int *buf) {
55 size_t x = fwrite(buf, sizeof(int), 10, fp);
56 clang_analyzer_eval(x <= 10); // expected-warning{{TRUE}}
57 size_t y = fread(buf, sizeof(int), 10, fp);
58 clang_analyzer_eval(y <= 10); // expected-warning{{TRUE}}
59 size_t z = fwrite(buf, sizeof(int), y, fp);
60 clang_analyzer_eval(z <= y); // expected-warning{{TRUE}}
63 ssize_t getline(char **, size_t *, FILE *);
64 void test_getline(FILE *fp) {
68 while ((len = getline(&line, &n, fp)) != -1) {
69 clang_analyzer_eval(len == 0); // expected-warning{{FALSE}}
74 void test_isascii(int x) {
75 clang_analyzer_eval(isascii(123)); // expected-warning{{TRUE}}
76 clang_analyzer_eval(isascii(-1)); // expected-warning{{FALSE}}
78 clang_analyzer_eval(x < 128); // expected-warning{{TRUE}}
79 clang_analyzer_eval(x >= 0); // expected-warning{{TRUE}}
82 clang_analyzer_eval(x >= 128); // expected-warning{{TRUE}}
84 clang_analyzer_eval(x < 0); // expected-warning{{TRUE}}
88 clang_analyzer_eval(glob); // expected-warning{{TRUE}}
92 void test_islower(int x) {
93 clang_analyzer_eval(islower('x')); // expected-warning{{TRUE}}
94 clang_analyzer_eval(islower('X')); // expected-warning{{FALSE}}
96 clang_analyzer_eval(x < 'a'); // expected-warning{{FALSE}}
100 void test_getchar() {
104 clang_analyzer_eval(x < 0); // expected-warning{{FALSE}}
105 clang_analyzer_eval(x < 256); // expected-warning{{TRUE}}
109 void test_isalpha() {
110 clang_analyzer_eval(isalpha(']')); // expected-warning{{FALSE}}
111 clang_analyzer_eval(isalpha('Q')); // expected-warning{{TRUE}}
112 clang_analyzer_eval(isalpha(128)); // expected-warning{{UNKNOWN}}
117 clang_analyzer_eval(isalnum('1')); // expected-warning{{TRUE}}
118 clang_analyzer_eval(isalnum(')')); // expected-warning{{FALSE}}
122 void test_isblank() {
123 clang_analyzer_eval(isblank('\t')); // expected-warning{{TRUE}}
124 clang_analyzer_eval(isblank(' ')); // expected-warning{{TRUE}}
125 clang_analyzer_eval(isblank('\n')); // expected-warning{{FALSE}}
129 void test_ispunct(int x) {
130 clang_analyzer_eval(ispunct(' ')); // expected-warning{{FALSE}}
131 clang_analyzer_eval(ispunct(-1)); // expected-warning{{FALSE}}
132 clang_analyzer_eval(ispunct('#')); // expected-warning{{TRUE}}
133 clang_analyzer_eval(ispunct('_')); // expected-warning{{TRUE}}
135 clang_analyzer_eval(x < 127); // expected-warning{{TRUE}}
139 void test_isupper(int x) {
141 clang_analyzer_eval(x < 'A'); // expected-warning{{FALSE}}
146 void test_isgraph_isprint(int x) {
149 clang_analyzer_eval(isprint(x)); // expected-warning{{TRUE}}
153 void test_mixed_branches(int x) {
155 clang_analyzer_eval(isgraph(x)); // expected-warning{{TRUE}}
156 clang_analyzer_eval(isblank(x)); // expected-warning{{FALSE}}
157 } else if (isascii(x)) {
158 // isalnum() bifurcates here.
159 clang_analyzer_eval(isalnum(x)); // expected-warning{{TRUE}} // expected-warning{{FALSE}}
160 clang_analyzer_eval(isprint(x)); // expected-warning{{TRUE}} // expected-warning{{FALSE}}
165 void test_isspace(int x) {
170 clang_analyzer_eval(isspace(x)); // expected-warning{{TRUE}}
174 void test_isxdigit(int x) {
175 if (isxdigit(x) && isupper(x)) {
176 clang_analyzer_eval(x >= 'A'); // expected-warning{{TRUE}}
177 clang_analyzer_eval(x <= 'F'); // expected-warning{{TRUE}}
181 void test_call_by_pointer() {
182 typedef int (*func)(int);
184 clang_analyzer_eval(f('A')); // expected-warning{{TRUE}}
186 clang_analyzer_eval(f('A')); // expected-warning{{FALSE}}