]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Analysis/misc-ps-ranges.m
Update clang to r96341.
[FreeBSD/FreeBSD.git] / test / Analysis / misc-ps-ranges.m
1 // RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=basic -analyzer-constraints=range -verify -fblocks %s
2 // RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=range -verify -fblocks %s
3
4 // <rdar://problem/6776949>
5 // main's 'argc' argument is always > 0
6 int main(int argc, char* argv[]) {
7   int *p = 0;
8
9   if (argc == 0)
10     *p = 1;
11
12   if (argc == 1)
13     return 1;
14
15   int x = 1;
16   int i;
17   
18   for(i=1;i<argc;i++){
19     p = &x;
20   }
21
22   return *p; // no-warning
23 }
24
25 // PR 5969: the comparison of argc < 3 || argc > 4 should constraint the switch
26 //  statement from having the 'default' branch taken.  This previously reported a false
27 //  positive with the use of 'v'.
28
29 int pr5969(int argc, char *argv[]) {
30
31   int v;
32
33   if ((argc < 3) || (argc > 4)) return 0;
34
35   switch(argc) {
36     case 3:
37       v = 33;
38       break;
39     case 4:
40       v = 44;
41       break;
42   }
43
44   return v; // no-warning
45 }
46
47 int pr5969_positive(int argc, char *argv[]) {
48
49   int v;
50
51   if ((argc < 3) || (argc > 4)) return 0;
52
53   switch(argc) {
54     case 3:
55       v = 33;
56       break;
57   }
58
59   return v; // expected-warning{{Undefined or garbage value returned to caller}}
60 }