|  | // 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 | 
|  | } |