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