// RUN: %check_clang_tidy %s android-cloexec-open %t #define O_RDWR 1 #define O_EXCL 2 #define __O_CLOEXEC 3 #define O_CLOEXEC __O_CLOEXEC #define TEMP_FAILURE_RETRY(exp) \ ({ \ int _rc; \ do { \ _rc = (exp); \ } while (_rc == -1); \ }) extern "C" int open(const char *fn, int flags, ...); extern "C" int open64(const char *fn, int flags, ...); extern "C" int openat(int dirfd, const char *pathname, int flags, ...); void a() { open("filename", O_RDWR); // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'open' should use O_CLOEXEC where possible [android-cloexec-open] // CHECK-FIXES: O_RDWR | O_CLOEXEC TEMP_FAILURE_RETRY(open("filename", O_RDWR)); // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: 'open' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_CLOEXEC open("filename", O_RDWR | O_EXCL); // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: 'open' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_EXCL)); // CHECK-MESSAGES: :[[@LINE-1]]:54: warning: 'open' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC } void b() { open64("filename", O_RDWR); // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: 'open64' should use O_CLOEXEC where possible [android-cloexec-open] // CHECK-FIXES: O_RDWR | O_CLOEXEC TEMP_FAILURE_RETRY(open64("filename", O_RDWR)); // CHECK-MESSAGES: :[[@LINE-1]]:47: warning: 'open64' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_CLOEXEC open64("filename", O_RDWR | O_EXCL); // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'open64' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_EXCL)); // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: 'open64' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC } void c() { openat(0, "filename", O_RDWR); // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: 'openat' should use O_CLOEXEC where possible [android-cloexec-open] // CHECK-FIXES: O_RDWR | O_CLOEXEC TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR)); // CHECK-MESSAGES: :[[@LINE-1]]:50: warning: 'openat' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_CLOEXEC openat(0, "filename", O_RDWR | O_EXCL); // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: 'openat' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_EXCL)); // CHECK-MESSAGES: :[[@LINE-1]]:59: warning: 'openat' should use O_CLOEXEC where // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC } void f() { open("filename", 3); // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 'open' should use O_CLOEXEC where possible [android-cloexec-open] // CHECK-FIXES: 3 | O_CLOEXEC TEMP_FAILURE_RETRY(open("filename", 3)); // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: 'open' should use O_CLOEXEC where // CHECK-FIXES: 3 | O_CLOEXEC open64("filename", 3); // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 'open64' should use O_CLOEXEC where possible [android-cloexec-open] // CHECK-FIXES: 3 | O_CLOEXEC TEMP_FAILURE_RETRY(open64("filename", 3)); // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: 'open64' should use O_CLOEXEC where // CHECK-FIXES: 3 | O_CLOEXEC openat(0, "filename", 3); // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'openat' should use O_CLOEXEC where possible [android-cloexec-open] // CHECK-FIXES: 3 | O_CLOEXEC TEMP_FAILURE_RETRY(openat(0, "filename", 3)); // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: 'openat' should use O_CLOEXEC where // CHECK-FIXES: 3 | O_CLOEXEC int flag = 3; open("filename", flag); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open("filename", flag)); // CHECK-MESSAGES-NOT: warning: open64("filename", flag); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open64("filename", flag)); // CHECK-MESSAGES-NOT: warning: openat(0, "filename", flag); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(openat(0, "filename", flag)); // CHECK-MESSAGES-NOT: warning: } namespace i { int open(const char *pathname, int flags, ...); int open64(const char *pathname, int flags, ...); int openat(int dirfd, const char *pathname, int flags, ...); void d() { open("filename", O_RDWR); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open("filename", O_RDWR)); // CHECK-MESSAGES-NOT: warning: open64("filename", O_RDWR); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open64("filename", O_RDWR)); // CHECK-MESSAGES-NOT: warning: openat(0, "filename", O_RDWR); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR)); // CHECK-MESSAGES-NOT: warning: } } // namespace i void e() { open("filename", O_CLOEXEC); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open("filename", O_CLOEXEC)); // CHECK-MESSAGES-NOT: warning: open("filename", O_RDWR | O_CLOEXEC); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_CLOEXEC)); // CHECK-MESSAGES-NOT: warning: open("filename", O_RDWR | O_CLOEXEC | O_EXCL); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_CLOEXEC | O_EXCL)); // CHECK-MESSAGES-NOT: warning: open64("filename", O_CLOEXEC); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open64("filename", O_CLOEXEC)); // CHECK-MESSAGES-NOT: warning: open64("filename", O_RDWR | O_CLOEXEC); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_CLOEXEC)); // CHECK-MESSAGES-NOT: warning: open64("filename", O_RDWR | O_CLOEXEC | O_EXCL); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_CLOEXEC | O_EXCL)); // CHECK-MESSAGES-NOT: warning: openat(0, "filename", O_CLOEXEC); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(openat(0, "filename", O_CLOEXEC)); // CHECK-MESSAGES-NOT: warning: openat(0, "filename", O_RDWR | O_CLOEXEC); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_CLOEXEC)); // CHECK-MESSAGES-NOT: warning: openat(0, "filename", O_RDWR | O_CLOEXEC | O_EXCL); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_CLOEXEC | O_EXCL)); // CHECK-MESSAGES-NOT: warning: } class G { public: int open(const char *pathname, int flags, ...); int open64(const char *pathname, int flags, ...); int openat(int dirfd, const char *pathname, int flags, ...); void h() { open("filename", O_RDWR); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open("filename", O_RDWR)); // CHECK-MESSAGES-NOT: warning: open64("filename", O_RDWR); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(open64("filename", O_RDWR)); // CHECK-MESSAGES-NOT: warning: openat(0, "filename", O_RDWR); // CHECK-MESSAGES-NOT: warning: TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR)); // CHECK-MESSAGES-NOT: warning: } };