diff options
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/android-cloexec-socket.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/android-cloexec-socket.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/android-cloexec-socket.cpp b/clang-tools-extra/test/clang-tidy/android-cloexec-socket.cpp new file mode 100644 index 00000000000..25f332d3138 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/android-cloexec-socket.cpp @@ -0,0 +1,75 @@ +// RUN: %check_clang_tidy %s android-cloexec-socket %t + +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define __O_CLOEXEC 3 +#define SOCK_CLOEXEC __O_CLOEXEC +#define TEMP_FAILURE_RETRY(exp) \ + ({ \ + int _rc; \ + do { \ + _rc = (exp); \ + } while (_rc == -1); \ + }) + +extern "C" int socket(int domain, int type, int protocol); + +void a() { + socket(0, SOCK_STREAM, 0); + // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: 'socket' should use SOCK_CLOEXEC where possible [android-cloexec-socket] + // CHECK-FIXES: socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0) + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM, 0)); + // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: 'socket' + // CHECK-FIXES: TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0)) + socket(0, SOCK_STREAM | SOCK_DGRAM, 0); + // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'socket' + // CHECK-FIXES: socket(0, SOCK_STREAM | SOCK_DGRAM | SOCK_CLOEXEC, 0) + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM, 0)); + // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: 'socket' + // CHECK-FIXES: TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM | SOCK_CLOEXEC, 0)) +} + +void f() { + socket(0, 3, 0); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: 'socket' + // CHECK-FIXES: socket(0, 3 | SOCK_CLOEXEC, 0) + TEMP_FAILURE_RETRY(socket(0, 3, 0)); + // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: 'socket' + // CHECK-FIXES: TEMP_FAILURE_RETRY(socket(0, 3 | SOCK_CLOEXEC, 0)) + + int flag = 3; + socket(0, flag, 0); + TEMP_FAILURE_RETRY(socket(0, flag, 0)); +} + +namespace i { +int socket(int domain, int type, int protocol); + +void d() { + socket(0, SOCK_STREAM, 0); + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM, 0)); + socket(0, SOCK_STREAM | SOCK_DGRAM, 0); + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM, 0)); +} + +} // namespace i + +void e() { + socket(0, SOCK_CLOEXEC, 0); + TEMP_FAILURE_RETRY(socket(0, SOCK_CLOEXEC, 0)); + socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0); + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_CLOEXEC, 0)); + socket(0, SOCK_STREAM | SOCK_CLOEXEC | SOCK_DGRAM, 0); + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_CLOEXEC | SOCK_DGRAM, 0)); +} + +class G { +public: + int socket(int domain, int type, int protocol); + void d() { + socket(0, SOCK_STREAM, 0); + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM, 0)); + socket(0, SOCK_STREAM | SOCK_DGRAM, 0); + TEMP_FAILURE_RETRY(socket(0, SOCK_STREAM | SOCK_DGRAM, 0)); + } +}; |