xref: /llvm-project/clang/test/Analysis/globals-are-not-always-immutable.c (revision f4fc3f6ba319c3c571b6a713a1c38ca1e1e3aae5)
1 // RUN: %clang_analyze_cc1 -verify %s \
2 // RUN:   -analyzer-config eagerly-assume=false \
3 // RUN:   -analyzer-checker=core,debug.ExprInspection
4 
5 #include "Inputs/errno_var.h"
6 #include "Inputs/some_system_globals.h"
7 #include "Inputs/some_user_globals.h"
8 
9 extern void abort() __attribute__((__noreturn__));
10 #define assert(expr) ((expr) ? (void)(0) : abort())
11 
12 void invalidate_globals(void);
13 void clang_analyzer_eval(int x);
14 
15 /// Test the special system 'errno'
test_errno_constraint()16 void test_errno_constraint() {
17   assert(errno > 2);
18   clang_analyzer_eval(errno > 2); // expected-warning {{TRUE}}
19   invalidate_globals();
20   clang_analyzer_eval(errno > 2); // expected-warning {{UNKNOWN}}
21 }
test_errno_assign(int x)22 void test_errno_assign(int x) {
23   errno = x;
24   clang_analyzer_eval(errno == x); // expected-warning {{TRUE}}
25   invalidate_globals();
26   clang_analyzer_eval(errno == x); // expected-warning {{UNKNOWN}}
27 }
28 
29 /// Test user global variables
test_my_const_user_global_constraint()30 void test_my_const_user_global_constraint() {
31   assert(my_const_user_global > 2);
32   clang_analyzer_eval(my_const_user_global > 2); // expected-warning {{TRUE}}
33   invalidate_globals();
34   clang_analyzer_eval(my_const_user_global > 2); // expected-warning {{TRUE}}
35 }
36 void test_my_const_user_global_assign(int); // One cannot assign value to a const lvalue.
37 
test_my_mutable_user_global_constraint()38 void test_my_mutable_user_global_constraint() {
39   assert(my_mutable_user_global > 2);
40   clang_analyzer_eval(my_mutable_user_global > 2); // expected-warning {{TRUE}}
41   invalidate_globals();
42   clang_analyzer_eval(my_mutable_user_global > 2); // expected-warning {{UNKNOWN}}
43 }
test_my_mutable_user_global_assign(int x)44 void test_my_mutable_user_global_assign(int x) {
45   my_mutable_user_global = x;
46   clang_analyzer_eval(my_mutable_user_global == x); // expected-warning {{TRUE}}
47   invalidate_globals();
48   clang_analyzer_eval(my_mutable_user_global == x); // expected-warning {{UNKNOWN}}
49 }
50 
51 /// Test system global variables
test_my_const_system_global_constraint()52 void test_my_const_system_global_constraint() {
53   assert(my_const_system_global > 2);
54   clang_analyzer_eval(my_const_system_global > 2); // expected-warning {{TRUE}}
55   invalidate_globals();
56   clang_analyzer_eval(my_const_system_global > 2); // expected-warning {{TRUE}}
57 }
58 void test_my_const_system_global_assign(int);// One cannot assign value to a const lvalue.
59 
test_my_mutable_system_global_constraint()60 void test_my_mutable_system_global_constraint() {
61   assert(my_mutable_system_global > 2);
62   clang_analyzer_eval(my_mutable_system_global > 2); // expected-warning {{TRUE}}
63   invalidate_globals();
64   clang_analyzer_eval(my_mutable_system_global > 2); // expected-warning {{UNKNOWN}}
65 }
test_my_mutable_system_global_assign(int x)66 void test_my_mutable_system_global_assign(int x) {
67   my_mutable_system_global = x;
68   clang_analyzer_eval(my_mutable_system_global == x); // expected-warning {{TRUE}}
69   invalidate_globals();
70   clang_analyzer_eval(my_mutable_system_global == x); // expected-warning {{UNKNOWN}}
71 }
72