1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.API -verify %s
2
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
open_1(const char * path)14 void open_1(const char *path) {
15 int fd;
16 fd = open(path, O_RDONLY); // no-warning
17 if (fd > -1)
18 close(fd);
19 }
20
open_2(const char * path)21 void open_2(const char *path) {
22 int fd;
23 int mode = 0x0;
24 fd = open(path, O_RDONLY, mode, NULL); // expected-warning{{Call to 'open' with more than three arguments}}
25 if (fd > -1)
26 close(fd);
27 }
28
open_3(const char * path)29 void open_3(const char *path) {
30 int fd;
31 fd = open(path, O_RDONLY, NULL); // expected-warning{{Third argument to 'open' is not an integer}}
32 if (fd > -1)
33 close(fd);
34 }
35
open_4(const char * path)36 void open_4(const char *path) {
37 int fd;
38 fd = open(path, O_RDONLY, ""); // expected-warning{{Third argument to 'open' is not an integer}}
39 if (fd > -1)
40 close(fd);
41 }
42
open_5(const char * path)43 void open_5(const char *path) {
44 int fd;
45 struct {
46 int val;
47 } st = {0};
48 fd = open(path, O_RDONLY, st); // expected-warning{{Third argument to 'open' is not an integer}}
49 if (fd > -1)
50 close(fd);
51 }
52
open_6(const char * path)53 void open_6(const char *path) {
54 int fd;
55 struct {
56 int val;
57 } st = {0};
58 fd = open(path, O_RDONLY, st.val); // no-warning
59 if (fd > -1)
60 close(fd);
61 }
62
open_7(const char * path)63 void open_7(const char *path) {
64 int fd;
65 fd = open(path, O_RDONLY, &open); // expected-warning{{Third argument to 'open' is not an integer}}
66 if (fd > -1)
67 close(fd);
68 }
69
open_8(const char * path)70 void open_8(const char *path) {
71 int fd;
72 fd = open(path, O_RDONLY, 0.0f); // expected-warning{{Third argument to 'open' is not an integer}}
73 if (fd > -1)
74 close(fd);
75 }
76