| // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.API -verify %s | |
| extern "C" { | |
| #ifndef O_RDONLY | |
| #define O_RDONLY 0 | |
| #endif | |
| #ifndef NULL | |
| #define NULL ((void*) 0) | |
| #endif | |
| int open(const char *, int, ...); | |
| int close(int fildes); | |
| } // extern "C" | |
| namespace MyNameSpace { | |
| int open(const char *a, int b, int c, int d); | |
| } | |
| void unix_open(const char *path) { | |
| int fd; | |
| fd = open(path, O_RDONLY); // no-warning | |
| if (fd > -1) | |
| close(fd); | |
| } | |
| void unix_open_misuse(const char *path) { | |
| int fd; | |
| int mode = 0x0; | |
| fd = open(path, O_RDONLY, mode, NULL); // expected-warning{{Call to 'open' with more than 3 arguments}} | |
| if (fd > -1) | |
| close(fd); | |
| } | |
| // Don't treat open() in namespaces as the POSIX open() | |
| void namespaced_open(const char *path) { | |
| MyNameSpace::open("Hi", 2, 3, 4); // no-warning | |
| using namespace MyNameSpace; | |
| open("Hi", 2, 3, 4); // no-warning | |
| int fd; | |
| int mode = 0x0; | |
| fd = ::open(path, O_RDONLY, mode, NULL); // expected-warning{{Call to 'open' with more than 3 arguments}} | |
| if (fd > -1) | |
| close(fd); | |
| } | |
| class MyClass { | |
| public: | |
| static int open(const char *a, int b, int c, int d); | |
| int open(int a, int, int c, int d); | |
| }; | |
| void class_qualified_open() { | |
| MyClass::open("Hi", 2, 3, 4); // no-warning | |
| MyClass mc; | |
| mc.open(1, 2, 3, 4); // no-warning | |
| } |