global-region-invalidation.c revision eb31a76d1cdaaf8874c549dc6bd964ff270d3822
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -disable-free -analyzer-eagerly-assume -analyzer-checker=core,deadcode,experimental.security.taint,debug.TaintTest -verify %s
2
3// Note, we do need to include headers here, since the analyzer checks if the function declaration is located in a system header.
4#include "system-header-simulator.h"
5
6// Test that system header does not invalidate the internal global.
7int size_rdar9373039 = 1;
8int rdar9373039() {
9  int x;
10  int j = 0;
11
12  for (int i = 0 ; i < size_rdar9373039 ; ++i)
13    x = 1;
14
15  // strlen doesn't invalidate the value of 'size_rdar9373039'.
16  int extra = (2 + strlen ("Clang") + ((4 - ((unsigned int) (2 + strlen ("Clang")) % 4)) % 4)) + (2 + strlen ("1.0") + ((4 - ((unsigned int) (2 + strlen ("1.0")) % 4)) % 4));
17
18  for (int i = 0 ; i < size_rdar9373039 ; ++i)
19    j += x; // no-warning
20
21  return j;
22}
23
24// Test stdin does not get invalidated by a system call nor by an internal call.
25void foo();
26int stdinTest() {
27  int i = 0;
28  fscanf(stdin, "%d", &i);
29  foo();
30  int m = i; // expected-warning + {{tainted}}
31  fscanf(stdin, "%d", &i);
32  int j = i; // expected-warning + {{tainted}}
33  return m + j; // expected-warning + {{tainted}}
34}
35
36// Test errno gets invalidated by a system call.
37int testErrnoSystem() {
38  int i;
39  int *p = 0;
40  fscanf(stdin, "%d", &i);
41  if (errno == 0) {
42    fscanf(stdin, "%d", &i); // errno gets invalidated here.
43    return 5 / errno; // no-warning
44  }
45  return 0;
46}
47
48// Test that errno gets invalidated by internal calls.
49int testErrnoInternal() {
50  int i;
51  int *p = 0;
52  fscanf(stdin, "%d", &i);
53  if (errno == 0) {
54    foo(); // errno gets invalidated here.
55    return 5 / errno; // no-warning
56  }
57  return 0;
58}
59
60// Test that const integer does not get invalidated.
61const int x = 0;
62int constIntGlob() {
63  const int *m = &x;
64    foo();
65  return 3 / *m; // expected-warning {{Division by zero}}
66}
67
68extern const int x;
69int constIntGlobExtern() {
70  if (x == 0) {
71    foo();
72    return 5 / x; // expected-warning {{Division by zero}}
73  }
74  return 0;
75}
76