xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/android/cloexec-open.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s android-cloexec-open %t
2*89a1d03eSRichard 
3*89a1d03eSRichard #define O_RDWR 1
4*89a1d03eSRichard #define O_EXCL 2
5*89a1d03eSRichard #define __O_CLOEXEC 3
6*89a1d03eSRichard #define O_CLOEXEC __O_CLOEXEC
7*89a1d03eSRichard #define TEMP_FAILURE_RETRY(exp) \
8*89a1d03eSRichard   ({                            \
9*89a1d03eSRichard     int _rc;                    \
10*89a1d03eSRichard     do {                        \
11*89a1d03eSRichard       _rc = (exp);              \
12*89a1d03eSRichard     } while (_rc == -1);        \
13*89a1d03eSRichard   })
14*89a1d03eSRichard 
15*89a1d03eSRichard extern "C" int open(const char *fn, int flags, ...);
16*89a1d03eSRichard extern "C" int open64(const char *fn, int flags, ...);
17*89a1d03eSRichard extern "C" int openat(int dirfd, const char *pathname, int flags, ...);
18*89a1d03eSRichard 
a()19*89a1d03eSRichard void a() {
20*89a1d03eSRichard   open("filename", O_RDWR);
21*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'open' should use O_CLOEXEC where possible [android-cloexec-open]
22*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_CLOEXEC
23*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", O_RDWR));
24*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: 'open' should use O_CLOEXEC where
25*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_CLOEXEC
26*89a1d03eSRichard   open("filename", O_RDWR | O_EXCL);
27*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: 'open' should use O_CLOEXEC where
28*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC
29*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_EXCL));
30*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:54: warning: 'open' should use O_CLOEXEC where
31*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC
32*89a1d03eSRichard }
33*89a1d03eSRichard 
b()34*89a1d03eSRichard void b() {
35*89a1d03eSRichard   open64("filename", O_RDWR);
36*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: 'open64' should use O_CLOEXEC where possible [android-cloexec-open]
37*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_CLOEXEC
38*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", O_RDWR));
39*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:47: warning: 'open64' should use O_CLOEXEC where
40*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_CLOEXEC
41*89a1d03eSRichard   open64("filename", O_RDWR | O_EXCL);
42*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'open64' should use O_CLOEXEC where
43*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC
44*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_EXCL));
45*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: 'open64' should use O_CLOEXEC where
46*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC
47*89a1d03eSRichard }
48*89a1d03eSRichard 
c()49*89a1d03eSRichard void c() {
50*89a1d03eSRichard   openat(0, "filename", O_RDWR);
51*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: 'openat' should use O_CLOEXEC where possible [android-cloexec-open]
52*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_CLOEXEC
53*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR));
54*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:50: warning: 'openat' should use O_CLOEXEC where
55*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_CLOEXEC
56*89a1d03eSRichard   openat(0, "filename", O_RDWR | O_EXCL);
57*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: 'openat' should use O_CLOEXEC where
58*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC
59*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_EXCL));
60*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:59: warning: 'openat' should use O_CLOEXEC where
61*89a1d03eSRichard   // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC
62*89a1d03eSRichard }
63*89a1d03eSRichard 
f()64*89a1d03eSRichard void f() {
65*89a1d03eSRichard   open("filename", 3);
66*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 'open' should use O_CLOEXEC where possible [android-cloexec-open]
67*89a1d03eSRichard   // CHECK-FIXES: 3 | O_CLOEXEC
68*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", 3));
69*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: 'open' should use O_CLOEXEC where
70*89a1d03eSRichard   // CHECK-FIXES: 3 | O_CLOEXEC
71*89a1d03eSRichard   open64("filename", 3);
72*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 'open64' should use O_CLOEXEC where possible [android-cloexec-open]
73*89a1d03eSRichard   // CHECK-FIXES: 3 | O_CLOEXEC
74*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", 3));
75*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: 'open64' should use O_CLOEXEC where
76*89a1d03eSRichard   // CHECK-FIXES: 3 | O_CLOEXEC
77*89a1d03eSRichard   openat(0, "filename", 3);
78*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'openat' should use O_CLOEXEC where possible [android-cloexec-open]
79*89a1d03eSRichard   // CHECK-FIXES: 3 | O_CLOEXEC
80*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", 3));
81*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: 'openat' should use O_CLOEXEC where
82*89a1d03eSRichard   // CHECK-FIXES: 3 | O_CLOEXEC
83*89a1d03eSRichard 
84*89a1d03eSRichard   int flag = 3;
85*89a1d03eSRichard   open("filename", flag);
86*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
87*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", flag));
88*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
89*89a1d03eSRichard   open64("filename", flag);
90*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
91*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", flag));
92*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
93*89a1d03eSRichard   openat(0, "filename", flag);
94*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
95*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", flag));
96*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
97*89a1d03eSRichard }
98*89a1d03eSRichard 
99*89a1d03eSRichard namespace i {
100*89a1d03eSRichard int open(const char *pathname, int flags, ...);
101*89a1d03eSRichard int open64(const char *pathname, int flags, ...);
102*89a1d03eSRichard int openat(int dirfd, const char *pathname, int flags, ...);
103*89a1d03eSRichard 
d()104*89a1d03eSRichard void d() {
105*89a1d03eSRichard   open("filename", O_RDWR);
106*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
107*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", O_RDWR));
108*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
109*89a1d03eSRichard   open64("filename", O_RDWR);
110*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
111*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", O_RDWR));
112*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
113*89a1d03eSRichard   openat(0, "filename", O_RDWR);
114*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
115*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR));
116*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
117*89a1d03eSRichard }
118*89a1d03eSRichard 
119*89a1d03eSRichard } // namespace i
120*89a1d03eSRichard 
e()121*89a1d03eSRichard void e() {
122*89a1d03eSRichard   open("filename", O_CLOEXEC);
123*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
124*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", O_CLOEXEC));
125*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
126*89a1d03eSRichard   open("filename", O_RDWR | O_CLOEXEC);
127*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
128*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_CLOEXEC));
129*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
130*89a1d03eSRichard   open("filename", O_RDWR | O_CLOEXEC | O_EXCL);
131*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
132*89a1d03eSRichard   TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_CLOEXEC | O_EXCL));
133*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
134*89a1d03eSRichard   open64("filename", O_CLOEXEC);
135*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
136*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", O_CLOEXEC));
137*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
138*89a1d03eSRichard   open64("filename", O_RDWR | O_CLOEXEC);
139*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
140*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_CLOEXEC));
141*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
142*89a1d03eSRichard   open64("filename", O_RDWR | O_CLOEXEC | O_EXCL);
143*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
144*89a1d03eSRichard   TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_CLOEXEC | O_EXCL));
145*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
146*89a1d03eSRichard   openat(0, "filename", O_CLOEXEC);
147*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
148*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", O_CLOEXEC));
149*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
150*89a1d03eSRichard   openat(0, "filename", O_RDWR | O_CLOEXEC);
151*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
152*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_CLOEXEC));
153*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
154*89a1d03eSRichard   openat(0, "filename", O_RDWR | O_CLOEXEC | O_EXCL);
155*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
156*89a1d03eSRichard   TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_CLOEXEC | O_EXCL));
157*89a1d03eSRichard   // CHECK-MESSAGES-NOT: warning:
158*89a1d03eSRichard }
159*89a1d03eSRichard 
160*89a1d03eSRichard class G {
161*89a1d03eSRichard public:
162*89a1d03eSRichard   int open(const char *pathname, int flags, ...);
163*89a1d03eSRichard   int open64(const char *pathname, int flags, ...);
164*89a1d03eSRichard   int openat(int dirfd, const char *pathname, int flags, ...);
165*89a1d03eSRichard 
h()166*89a1d03eSRichard   void h() {
167*89a1d03eSRichard     open("filename", O_RDWR);
168*89a1d03eSRichard     // CHECK-MESSAGES-NOT: warning:
169*89a1d03eSRichard     TEMP_FAILURE_RETRY(open("filename", O_RDWR));
170*89a1d03eSRichard     // CHECK-MESSAGES-NOT: warning:
171*89a1d03eSRichard     open64("filename", O_RDWR);
172*89a1d03eSRichard     // CHECK-MESSAGES-NOT: warning:
173*89a1d03eSRichard     TEMP_FAILURE_RETRY(open64("filename", O_RDWR));
174*89a1d03eSRichard     // CHECK-MESSAGES-NOT: warning:
175*89a1d03eSRichard     openat(0, "filename", O_RDWR);
176*89a1d03eSRichard     // CHECK-MESSAGES-NOT: warning:
177*89a1d03eSRichard     TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR));
178*89a1d03eSRichard     // CHECK-MESSAGES-NOT: warning:
179*89a1d03eSRichard   }
180*89a1d03eSRichard };
181