diff options
| author | Aaron Ballman <aaron@aaronballman.com> | 2015-09-30 14:09:38 +0000 |
|---|---|---|
| committer | Aaron Ballman <aaron@aaronballman.com> | 2015-09-30 14:09:38 +0000 |
| commit | 8db15e4a4d758ed0c2ceb17f9c0b4911f1a9221b (patch) | |
| tree | 265931fd4d2f3b4a31261dd4f1a5009342443615 /clang-tools-extra/test/clang-tidy/misc-non-copyable-objects.c | |
| parent | bcea69669f3a2c0aa250274c4ccb823d24ee1f12 (diff) | |
| download | bcm5719-llvm-8db15e4a4d758ed0c2ceb17f9c0b4911f1a9221b.tar.gz bcm5719-llvm-8db15e4a4d758ed0c2ceb17f9c0b4911f1a9221b.zip | |
Adding a checker (misc-non-copyable-objects) that detects situations where a non-copyable C type is being dereferenced, such as FILE or pthread_mutex_t. Corresponds to the CERT C++ secure coding rule: https://www.securecoding.cert.org/confluence/display/c/FIO38-C.+Do+not+copy+a+FILE+object
llvm-svn: 248907
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/misc-non-copyable-objects.c')
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-non-copyable-objects.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/misc-non-copyable-objects.c b/clang-tools-extra/test/clang-tidy/misc-non-copyable-objects.c new file mode 100644 index 00000000000..4fe10e627ba --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/misc-non-copyable-objects.c @@ -0,0 +1,43 @@ +// RUN: %python %S/check_clang_tidy.py %s misc-non-copyable-objects %t
+
+typedef struct FILE {} FILE;
+typedef struct pthread_cond_t {} pthread_cond_t;
+typedef int pthread_mutex_t;
+
+// CHECK-MESSAGES: :[[@LINE+1]]:13: warning: 'f' declared as type 'FILE', which is unsafe to copy; did you mean 'FILE *'? [misc-non-copyable-objects]
+void g(FILE f);
+// CHECK-MESSAGES: :[[@LINE+1]]:24: warning: 'm' declared as type 'pthread_mutex_t', which is unsafe to copy; did you mean 'pthread_mutex_t *'?
+void h(pthread_mutex_t m);
+// CHECK-MESSAGES: :[[@LINE+1]]:23: warning: 'c' declared as type 'pthread_cond_t', which is unsafe to copy; did you mean 'pthread_cond_t *'?
+void i(pthread_cond_t c);
+
+struct S {
+ pthread_cond_t c; // ok
+ // CHECK-MESSAGES: :[[@LINE+1]]:8: warning: 'f' declared as type 'FILE', which is unsafe to copy; did you mean 'FILE *'?
+ FILE f;
+};
+
+void func(FILE *f) {
+ // CHECK-MESSAGES: :[[@LINE+1]]:8: warning: 'f1' declared as type 'FILE', which is unsafe to copy; did you mean 'FILE *'?
+ FILE f1; // match
+ // CHECK-MESSAGES: :[[@LINE+2]]:8: warning: 'f2' declared as type 'FILE', which is unsafe to copy; did you mean 'FILE *'?
+ // CHECK-MESSAGES: :[[@LINE+1]]:13: warning: expression has opaque data structure type 'FILE'; type should only be used as a pointer and not dereferenced
+ FILE f2 = *f;
+ // CHECK-MESSAGES: :[[@LINE+1]]:15: warning: 'f3' declared as type 'FILE', which is unsafe to copy; did you mean 'FILE *'?
+ struct FILE f3;
+ // CHECK-MESSAGES: :[[@LINE+1]]:16: warning: expression has opaque data structure type 'FILE'; type should only be used as a pointer and not dereferenced
+ (void)sizeof(*f);
+ (void)sizeof(FILE);
+ // CHECK-MESSAGES: :[[@LINE+1]]:5: warning: expression has opaque data structure type 'FILE'; type should only be used as a pointer and not dereferenced
+ g(*f);
+
+ pthread_mutex_t m; // ok
+ h(m); // ok
+
+ pthread_cond_t c; // ok
+ i(c); // ok
+
+ pthread_mutex_t *m1 = &m; // ok
+ // CHECK-MESSAGES: :[[@LINE+1]]:5: warning: expression has opaque data structure type 'pthread_mutex_t'; type should only be used as a pointer and not dereferenced
+ h(*m1);
+}
\ No newline at end of file |

