diff options
| author | Yuanfang Chen <yuanfang.chen@sony.com> | 2019-08-21 20:00:01 +0000 |
|---|---|---|
| committer | Yuanfang Chen <yuanfang.chen@sony.com> | 2019-08-21 20:00:01 +0000 |
| commit | f24c1e6b515ed7aec632b5e4c6019e7dd0972efa (patch) | |
| tree | e6b14700bbf4d54dc4905e27cdaf87e43deeb1e5 /clang-tools-extra/test/clang-tidy/bugprone-dynamic-static-initializers.hpp | |
| parent | ed18e70c86f6de353cebe0a8faa961a341c74d27 (diff) | |
| download | bcm5719-llvm-f24c1e6b515ed7aec632b5e4c6019e7dd0972efa.tar.gz bcm5719-llvm-f24c1e6b515ed7aec632b5e4c6019e7dd0972efa.zip | |
[clang-tidy] Check for dynamically initialized statics in headers.
Finds instances where variables with static storage are initialized dynamically in header files.
Reviewed By: aaron.ballman, alexfh
Patch by Charles Zhang!
Differential Revision: https://reviews.llvm.org/D62829
llvm-svn: 369568
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/bugprone-dynamic-static-initializers.hpp')
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/bugprone-dynamic-static-initializers.hpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/bugprone-dynamic-static-initializers.hpp b/clang-tools-extra/test/clang-tidy/bugprone-dynamic-static-initializers.hpp new file mode 100644 index 00000000000..647b2e57165 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/bugprone-dynamic-static-initializers.hpp @@ -0,0 +1,44 @@ +// RUN: %check_clang_tidy %s bugprone-dynamic-static-initializers %t -- -- -fno-threadsafe-statics + +int fact(int n) { + return (n == 0) ? 1 : n * fact(n - 1); +} + +int static_thing = fact(5); +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: static variable 'static_thing' may be dynamically initialized in this header file [bugprone-dynamic-static-initializers] + +int sample() { + int x; + return x; +} + +int dynamic_thing = sample(); +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: static variable 'dynamic_thing' may be dynamically initialized in this header file [bugprone-dynamic-static-initializers] + +int not_so_bad = 12 + 4942; // no warning + +extern int bar(); + +int foo() { + static int k = bar(); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: static variable 'k' may be dynamically initialized in this header file [bugprone-dynamic-static-initializers] + return k; +} + +int bar2() { + return 7; +} + +int foo2() { + // This may work fine when optimization is enabled because bar() can + // be turned into a constant 7. But without optimization, it can + // cause problems. Therefore, we must err on the side of conservatism. + static int x = bar2(); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: static variable 'x' may be dynamically initialized in this header file [bugprone-dynamic-static-initializers] + return x; +} + +int foo3() { + static int p = 7 + 83; // no warning + return p; +} |

