xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/android/cloexec-inotify-init1.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s android-cloexec-inotify-init1 %t
2*89a1d03eSRichard 
3*89a1d03eSRichard #define IN_NONBLOCK 1
4*89a1d03eSRichard #define __O_CLOEXEC 3
5*89a1d03eSRichard #define IN_CLOEXEC __O_CLOEXEC
6*89a1d03eSRichard #define TEMP_FAILURE_RETRY(exp) \
7*89a1d03eSRichard   ({                            \
8*89a1d03eSRichard     int _rc;                    \
9*89a1d03eSRichard     do {                        \
10*89a1d03eSRichard       _rc = (exp);              \
11*89a1d03eSRichard     } while (_rc == -1);        \
12*89a1d03eSRichard   })
13*89a1d03eSRichard 
14*89a1d03eSRichard extern "C" int inotify_init1(int flags);
15*89a1d03eSRichard 
a()16*89a1d03eSRichard void a() {
17*89a1d03eSRichard   inotify_init1(IN_NONBLOCK);
18*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: 'inotify_init1' should use IN_CLOEXEC where possible [android-cloexec-inotify-init1]
19*89a1d03eSRichard   // CHECK-FIXES: inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
20*89a1d03eSRichard   TEMP_FAILURE_RETRY(inotify_init1(IN_NONBLOCK));
21*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:47: warning: 'inotify_init1'
22*89a1d03eSRichard   // CHECK-FIXES: TEMP_FAILURE_RETRY(inotify_init1(IN_NONBLOCK | IN_CLOEXEC));
23*89a1d03eSRichard }
24*89a1d03eSRichard 
f()25*89a1d03eSRichard void f() {
26*89a1d03eSRichard   inotify_init1(0);
27*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: 'inotify_init1'
28*89a1d03eSRichard   // CHECK-FIXES: inotify_init1(IN_CLOEXEC);
29*89a1d03eSRichard   TEMP_FAILURE_RETRY(inotify_init1(0));
30*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'inotify_init1'
31*89a1d03eSRichard   // CHECK-FIXES: TEMP_FAILURE_RETRY(inotify_init1(IN_CLOEXEC));
32*89a1d03eSRichard 
33*89a1d03eSRichard   int flag = 1;
34*89a1d03eSRichard   inotify_init1(flag);
35*89a1d03eSRichard   TEMP_FAILURE_RETRY(inotify_init1(flag));
36*89a1d03eSRichard }
37*89a1d03eSRichard 
38*89a1d03eSRichard namespace i {
39*89a1d03eSRichard int inotify_init1(int flags);
40*89a1d03eSRichard 
d()41*89a1d03eSRichard void d() {
42*89a1d03eSRichard   inotify_init1(IN_NONBLOCK);
43*89a1d03eSRichard   TEMP_FAILURE_RETRY(inotify_init1(IN_NONBLOCK));
44*89a1d03eSRichard }
45*89a1d03eSRichard 
46*89a1d03eSRichard } // namespace i
47*89a1d03eSRichard 
e()48*89a1d03eSRichard void e() {
49*89a1d03eSRichard   inotify_init1(IN_CLOEXEC);
50*89a1d03eSRichard   TEMP_FAILURE_RETRY(inotify_init1(IN_CLOEXEC));
51*89a1d03eSRichard   inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
52*89a1d03eSRichard   TEMP_FAILURE_RETRY(inotify_init1(IN_NONBLOCK | IN_CLOEXEC));
53*89a1d03eSRichard }
54*89a1d03eSRichard 
55*89a1d03eSRichard class G {
56*89a1d03eSRichard public:
57*89a1d03eSRichard   int inotify_init1(int flags);
d()58*89a1d03eSRichard   void d() {
59*89a1d03eSRichard     inotify_init1(IN_CLOEXEC);
60*89a1d03eSRichard     TEMP_FAILURE_RETRY(inotify_init1(IN_CLOEXEC));
61*89a1d03eSRichard     inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
62*89a1d03eSRichard     TEMP_FAILURE_RETRY(inotify_init1(IN_NONBLOCK | IN_CLOEXEC));
63*89a1d03eSRichard   }
64*89a1d03eSRichard };
65