diff options
author | Yan Wang <yawanng@google.com> | 2017-07-12 17:43:36 +0000 |
---|---|---|
committer | Yan Wang <yawanng@google.com> | 2017-07-12 17:43:36 +0000 |
commit | b38045d02ebd412f32955769feaa6ba62f3ffd4d (patch) | |
tree | ea63c6589177cb53314d1a44aee21094cd60d889 /clang-tools-extra/test/clang-tidy/android-cloexec-socket.cpp | |
parent | 4fc696635ded88843f235e55b29c3eefc7c4810a (diff) | |
download | bcm5719-llvm-b38045d02ebd412f32955769feaa6ba62f3ffd4d.tar.gz bcm5719-llvm-b38045d02ebd412f32955769feaa6ba62f3ffd4d.zip |
[clang-tidy] Add a new Android check "android-cloexec-socket"
Summary: socket() is better to include SOCK_CLOEXEC in its type argument to avoid the file descriptor leakage.
Reviewers: chh, Eugene.Zelenko, alexfh, hokein, aaron.ballman
Reviewed By: chh, alexfh
Subscribers: srhines, mgorny, JDevlieghere, xazax.hun, cfe-commits
Tags: #clang-tools-extra
Differential Revision: https://reviews.llvm.org/D34913
llvm-svn: 307818
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)); + } +}; |