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