1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.API -verify %s |
2 | extern "C" { |
3 | #ifndef O_RDONLY |
4 | #define O_RDONLY 0 |
5 | #endif |
6 | |
7 | #ifndef NULL |
8 | #define NULL ((void*) 0) |
9 | #endif |
10 | |
11 | int open(const char *, int, ...); |
12 | int close(int fildes); |
13 | |
14 | } // extern "C" |
15 | |
16 | namespace MyNameSpace { |
17 | int open(const char *a, int b, int c, int d); |
18 | } |
19 | |
20 | void unix_open(const char *path) { |
21 | int fd; |
22 | fd = open(path, O_RDONLY); // no-warning |
23 | if (fd > -1) |
24 | close(fd); |
25 | } |
26 | |
27 | void unix_open_misuse(const char *path) { |
28 | int fd; |
29 | int mode = 0x0; |
30 | fd = open(path, O_RDONLY, mode, NULL); // expected-warning{{Call to 'open' with more than 3 arguments}} |
31 | if (fd > -1) |
32 | close(fd); |
33 | } |
34 | |
35 | // Don't treat open() in namespaces as the POSIX open() |
36 | void namespaced_open(const char *path) { |
37 | MyNameSpace::open("Hi", 2, 3, 4); // no-warning |
38 | |
39 | using namespace MyNameSpace; |
40 | |
41 | open("Hi", 2, 3, 4); // no-warning |
42 | |
43 | int fd; |
44 | int mode = 0x0; |
45 | fd = ::open(path, O_RDONLY, mode, NULL); // expected-warning{{Call to 'open' with more than 3 arguments}} |
46 | if (fd > -1) |
47 | close(fd); |
48 | } |
49 | |
50 | class MyClass { |
51 | public: |
52 | static int open(const char *a, int b, int c, int d); |
53 | |
54 | int open(int a, int, int c, int d); |
55 | }; |
56 | |
57 | void class_qualified_open() { |
58 | MyClass::open("Hi", 2, 3, 4); // no-warning |
59 | |
60 | MyClass mc; |
61 | mc.open(1, 2, 3, 4); // no-warning |
62 | } |
63 | |