blob: 184ffb870fb86b7ec13586e1069662fcabc929bc [file] [log] [blame]
Anna Zakseb31a762012-01-04 23:54:01 +00001// 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}