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