xref: /llvm-project/clang/test/Analysis/unix-api.cpp (revision 184c6242faca0be0188611d45b41235e68ef282a)
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