xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/android/cloexec-socket.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s android-cloexec-socket %t
2*89a1d03eSRichard 
3*89a1d03eSRichard #define SOCK_STREAM 1
4*89a1d03eSRichard #define SOCK_DGRAM 2
5*89a1d03eSRichard #define __O_CLOEXEC 3
6*89a1d03eSRichard #define SOCK_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 socket(int domain, int type, int protocol);
16*89a1d03eSRichard 
a()17*89a1d03eSRichard void a() {
18*89a1d03eSRichard   socket(0, SOCK_STREAM, 0);
19*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: 'socket' should use SOCK_CLOEXEC where possible [android-cloexec-socket]
20*89a1d03eSRichard   // CHECK-FIXES: socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0)
21*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM, 0));
22*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: 'socket'
23*89a1d03eSRichard   // CHECK-FIXES: TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0))
24*89a1d03eSRichard   socket(0, SOCK_STREAM | SOCK_DGRAM, 0);
25*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'socket'
26*89a1d03eSRichard   // CHECK-FIXES: socket(0, SOCK_STREAM | SOCK_DGRAM | SOCK_CLOEXEC, 0)
27*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM, 0));
28*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: 'socket'
29*89a1d03eSRichard   // CHECK-FIXES: TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM | SOCK_CLOEXEC, 0))
30*89a1d03eSRichard }
31*89a1d03eSRichard 
f()32*89a1d03eSRichard void f() {
33*89a1d03eSRichard   socket(0, 3, 0);
34*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: 'socket'
35*89a1d03eSRichard   // CHECK-FIXES: socket(0, 3 | SOCK_CLOEXEC, 0)
36*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, 3, 0));
37*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: 'socket'
38*89a1d03eSRichard   // CHECK-FIXES: TEMP_FAILURE_RETRY(socket(0, 3 | SOCK_CLOEXEC, 0))
39*89a1d03eSRichard 
40*89a1d03eSRichard   int flag = 3;
41*89a1d03eSRichard   socket(0, flag, 0);
42*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, flag, 0));
43*89a1d03eSRichard }
44*89a1d03eSRichard 
45*89a1d03eSRichard namespace i {
46*89a1d03eSRichard int socket(int domain, int type, int protocol);
47*89a1d03eSRichard 
d()48*89a1d03eSRichard void d() {
49*89a1d03eSRichard   socket(0, SOCK_STREAM, 0);
50*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM, 0));
51*89a1d03eSRichard   socket(0, SOCK_STREAM | SOCK_DGRAM, 0);
52*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM, 0));
53*89a1d03eSRichard }
54*89a1d03eSRichard 
55*89a1d03eSRichard } // namespace i
56*89a1d03eSRichard 
e()57*89a1d03eSRichard void e() {
58*89a1d03eSRichard   socket(0, SOCK_CLOEXEC, 0);
59*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, SOCK_CLOEXEC, 0));
60*89a1d03eSRichard   socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0);
61*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0));
62*89a1d03eSRichard   socket(0, SOCK_STREAM | SOCK_CLOEXEC | SOCK_DGRAM, 0);
63*89a1d03eSRichard   TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_CLOEXEC | SOCK_DGRAM, 0));
64*89a1d03eSRichard }
65*89a1d03eSRichard 
66*89a1d03eSRichard class G {
67*89a1d03eSRichard public:
68*89a1d03eSRichard   int socket(int domain, int type, int protocol);
d()69*89a1d03eSRichard   void d() {
70*89a1d03eSRichard     socket(0, SOCK_STREAM, 0);
71*89a1d03eSRichard     TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM, 0));
72*89a1d03eSRichard     socket(0, SOCK_STREAM | SOCK_DGRAM, 0);
73*89a1d03eSRichard     TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM, 0));
74*89a1d03eSRichard   }
75*89a1d03eSRichard };
76