misc-ps.c revision c957319941e93db2bc399efa7a9d1425bc609ba9
19a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -disable-free -analyzer-eagerly-assume -analyzer-checker=core -analyzer-checker=deadcode -verify %s
29a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
39a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint size_rdar9373039 = 1;
49a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint foo_rdar9373039(const char *);
59a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
69a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint rdar93730392() {
79a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  int x;
89a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  int j = 0;
99a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
109a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  for (int i = 0 ; i < size_rdar9373039 ; ++i)
119a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    x = 1;
129a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
139a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  int extra = (2 + foo_rdar9373039 ("Clang") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("Clang")) % 4)) % 4)) + (2 + foo_rdar9373039 ("1.0") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("1.0")) % 4)) % 4)); // expected-warning {{never read}}
149a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
159a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  for (int i = 0 ; i < size_rdar9373039 ; ++i)
169a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    j += x; // expected-warning {{garbage}}
179a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
189a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return j;
199a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
209a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
219a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
229a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962 (int *t) {
239a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // This should look through the __extension__ no-op.
249a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if (__extension__ (t)) return 0;
259a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return *t; // expected-warning {{null pointer}}
269a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
279a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
289a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_b (int *t) {
299a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // This should still ignore the nested casts
309a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // which aren't handled by a single IgnoreParens()
319a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if (((int)((int)t))) return 0;
329a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return *t; // expected-warning {{null pointer}}
339a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
349a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
359a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_c (int *t) {
369a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // If the last element in a StmtExpr was a ParenExpr, it's still live
379a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if (({ (t ? (_Bool)0 : (_Bool)1); })) return 0;
389a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return *t; // no-warning
399a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
409a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
419a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_d (int *t) {
429a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // If the last element in a StmtExpr is an __extension__, it's still live
439a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if (({ __extension__(t ? (_Bool)0 : (_Bool)1); })) return 0;
449a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return *t; // no-warning
459a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
469a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
479a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_e (int *t) {
489a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // Redundant casts can mess things up!
499a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // Environment used to skip through NoOp casts, but LiveVariables didn't!
509a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if (({ (t ? (int)(int)0L : (int)(int)1L); })) return 0;
519a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return *t; // no-warning
529a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
539a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
549a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_f (int *t) {
559a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // The StmtExpr isn't a block-level expression here,
569a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // the __extension__ is. But the value should be attached to the StmtExpr
579a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  // anyway. Make sure the block-level check is /before/ IgnoreParens.
589a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if ( __extension__({
599a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    _Bool r;
609a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    if (t) r = 0;
619a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    else r = 1;
629a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    r;
639a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  }) ) return 0;
649a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return *t; // no-warning
659a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
669a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
679a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian// This previously crashed logic in the analyzer engine when evaluating locations.
689a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid rdar10308201_aux(unsigned val);
699a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid rdar10308201 (int valA, void *valB, unsigned valC) {
709a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  unsigned actual_base, lines;
719a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if (valC == 0) {
729a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    actual_base = (unsigned)valB;
739a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    for (;;) {
749a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian      if (valA & (1<<0))
759a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian        rdar10308201_aux(actual_base);
769a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    }
779a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  }
789a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
799a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
809a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfaniantypedef struct Struct103 {
819a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  unsigned i;
829a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} Struct103;
839a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfaniantypedef unsigned int size_t;
849a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid __my_memset_chk(char*, int, size_t);
859a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianstatic int radar10367606(int t) {
869a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  Struct103 overall;
879a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  ((__builtin_object_size ((char *) &overall, 0) != (size_t) -1) ? __builtin___memset_chk ((char *) &overall, 0, sizeof(Struct103), __builtin_object_size ((char *) &overall, 0)) : __my_memset_chk ((char *) &overall, 0, sizeof(Struct103)));
889a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  return 0;
899a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
909a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
919a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian/* Caching out on a sink node. */
929a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianextern int fooR10376675();
939a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianextern int* bazR10376675();
949a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianextern int nR10376675;
959a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid barR10376675(int *x) {
969a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  int *pm;
979a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  if (nR10376675 * 2) {
989a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    int *pk  = bazR10376675();
999a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    pm = pk; //expected-warning {{never read}}
1009a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  }
1019a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  do {
1029a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    *x = fooR10376675();
1039a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian  } while (0);
1049a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}
1059a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian
1069a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian// Test accesses to wide character strings doesn't break the analyzer.
1079a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfaniantypedef int wchar_t;
1089a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianstruct rdar10385775 {
1099a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian    wchar_t *name;
1109a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian};
111void RDar10385775(struct rdar10385775* p) {
112    p->name = L"a";
113}
114
115// Test double loop of array and array literals.  Previously this
116// resulted in a false positive uninitailized value warning.
117void rdar10686586() {
118    int array1[] = { 1, 2, 3, 0 };
119    int array2[] = { 1, 2, 3, 0 };
120    int *array[] = { array1, array2 };
121    int sum = 0;
122    for (int i = 0; i < 2; i++) {
123        for (int j = 0; j < 4; j++) {
124            sum += array[i][j]; // no-warning
125        }
126    }
127}
128
129// This example tests CFG handling of '||' nested in a ternary expression,
130// and seeing that the analyzer doesn't crash.
131int isctype(char c, unsigned long f)
132{
133  return (c < 1 || c > 10) ? 0 : !!(c & f);
134}
135
136// Test that symbolic array offsets are modeled conservatively.
137// This was triggering a false "use of uninitialized value" warning.
138void rdar_12075238__aux(unsigned long y);
139int rdar_12075238_(unsigned long count) {
140  if ((count < 3) || (count > 6))
141    return 0;
142
143  unsigned long array[6];
144  unsigned long i = 0;
145  for (; i <= count - 2; i++)
146  {
147	  array[i] = i;
148  }
149  array[count - 1] = i;
150  rdar_12075238__aux(array[2]); // no-warning
151  return 0;
152}
153
154