xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/android/cloexec-memfd-create.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s android-cloexec-memfd-create %t
2*89a1d03eSRichard 
3*89a1d03eSRichard #define MFD_ALLOW_SEALING 1
4*89a1d03eSRichard #define __O_CLOEXEC 3
5*89a1d03eSRichard #define MFD_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 #define NULL 0
14*89a1d03eSRichard 
15*89a1d03eSRichard extern "C" int memfd_create(const char *name, unsigned int flags);
16*89a1d03eSRichard 
a()17*89a1d03eSRichard void a() {
18*89a1d03eSRichard   memfd_create(NULL, MFD_ALLOW_SEALING);
19*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: 'memfd_create' should use MFD_CLOEXEC where possible [android-cloexec-memfd-create]
20*89a1d03eSRichard   // CHECK-FIXES: memfd_create(NULL, MFD_ALLOW_SEALING | MFD_CLOEXEC)
21*89a1d03eSRichard   TEMP_FAILURE_RETRY(memfd_create(NULL, MFD_ALLOW_SEALING));
22*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:58: warning: 'memfd_create'
23*89a1d03eSRichard   // CHECK-FIXES: TEMP_FAILURE_RETRY(memfd_create(NULL, MFD_ALLOW_SEALING | MFD_CLOEXEC))
24*89a1d03eSRichard }
25*89a1d03eSRichard 
f()26*89a1d03eSRichard void f() {
27*89a1d03eSRichard   memfd_create(NULL, 3);
28*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 'memfd_create'
29*89a1d03eSRichard   // CHECK-FIXES: memfd_create(NULL, 3 | MFD_CLOEXEC)
30*89a1d03eSRichard   TEMP_FAILURE_RETRY(memfd_create(NULL, 3));
31*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: 'memfd_create'
32*89a1d03eSRichard   // CHECK-FIXES: TEMP_FAILURE_RETRY(memfd_create(NULL, 3 | MFD_CLOEXEC))
33*89a1d03eSRichard 
34*89a1d03eSRichard   int flag = 3;
35*89a1d03eSRichard   memfd_create(NULL, flag);
36*89a1d03eSRichard   TEMP_FAILURE_RETRY(memfd_create(NULL, flag));
37*89a1d03eSRichard }
38*89a1d03eSRichard 
39*89a1d03eSRichard namespace i {
40*89a1d03eSRichard int memfd_create(const char *name, unsigned int flags);
41*89a1d03eSRichard 
d()42*89a1d03eSRichard void d() {
43*89a1d03eSRichard   memfd_create(NULL, MFD_ALLOW_SEALING);
44*89a1d03eSRichard   TEMP_FAILURE_RETRY(memfd_create(NULL, MFD_ALLOW_SEALING));
45*89a1d03eSRichard }
46*89a1d03eSRichard 
47*89a1d03eSRichard } // namespace i
48*89a1d03eSRichard 
e()49*89a1d03eSRichard void e() {
50*89a1d03eSRichard   memfd_create(NULL, MFD_CLOEXEC);
51*89a1d03eSRichard   TEMP_FAILURE_RETRY(memfd_create(NULL, MFD_CLOEXEC));
52*89a1d03eSRichard   memfd_create(NULL, MFD_ALLOW_SEALING | MFD_CLOEXEC);
53*89a1d03eSRichard   TEMP_FAILURE_RETRY(memfd_create(NULL, MFD_ALLOW_SEALING | MFD_CLOEXEC));
54*89a1d03eSRichard }
55*89a1d03eSRichard 
56*89a1d03eSRichard class G {
57*89a1d03eSRichard public:
58*89a1d03eSRichard   int memfd_create(const char *name, unsigned int flags);
d()59*89a1d03eSRichard   void d() {
60*89a1d03eSRichard     memfd_create(NULL, MFD_ALLOW_SEALING);
61*89a1d03eSRichard     TEMP_FAILURE_RETRY(memfd_create(NULL, MFD_ALLOW_SEALING));
62*89a1d03eSRichard   }
63*89a1d03eSRichard };
64