1 | // RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -w -analyzer-checker=osx.NumberObjectConversion %s -verify |
2 | // RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -w -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true -DPEDANTIC %s -verify |
3 | |
4 | #define NULL ((void *)0) |
5 | |
6 | typedef const struct __CFNumber *CFNumberRef; |
7 | |
8 | void takes_int(int); |
9 | |
10 | void bad(CFNumberRef p) { |
11 | #ifdef PEDANTIC |
12 | if (p) {} // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive boolean value; instead, either compare the pointer to NULL or call CFNumberGetValue()}} |
13 | if (!p) {} // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive boolean value; instead, either compare the pointer to NULL or call CFNumberGetValue()}} |
14 | p ? 1 : 2; // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive boolean value; instead, either compare the pointer to NULL or call CFNumberGetValue()}} |
15 | if (p == 0) {} // expected-warning{{Comparing a pointer value of type 'CFNumberRef' to a primitive integer value; instead, either compare the pointer to NULL or compare the result of calling CFNumberGetValue()}} |
16 | #else |
17 | if (p) {} // no-warning |
18 | if (!p) {} // no-warning |
19 | p ? 1 : 2; // no-warning |
20 | if (p == 0) {} // no-warning |
21 | #endif |
22 | if (p > 0) {} // expected-warning{{Comparing a pointer value of type 'CFNumberRef' to a primitive integer value; did you mean to compare the result of calling CFNumberGetValue()?}} |
23 | int x = p; // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive integer value; did you mean to call CFNumberGetValue()?}} |
24 | x = p; // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive integer value; did you mean to call CFNumberGetValue()?}} |
25 | takes_int(p); // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive integer value; did you mean to call CFNumberGetValue()?}} |
26 | takes_int(x); // no-warning |
27 | } |
28 | |
29 | // Conversion of a pointer to an intptr_t is fine. |
30 | typedef long intptr_t; |
31 | typedef unsigned long uintptr_t; |
32 | typedef long fintptr_t; // Fake, for testing the regex. |
33 | void test_intptr_t(CFNumberRef p) { |
34 | (long)p; // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive integer value; did you mean to call CFNumberGetValue()?}} |
35 | (intptr_t)p; // no-warning |
36 | (unsigned long)p; // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive integer value; did you mean to call CFNumberGetValue()?}} |
37 | (uintptr_t)p; // no-warning |
38 | (fintptr_t)p; // expected-warning{{Converting a pointer value of type 'CFNumberRef' to a primitive integer value; did you mean to call CFNumberGetValue()?}} |
39 | } |
40 | |
41 | |