summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/smart-ptr.cpp
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-04-23 02:45:42 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-04-23 02:45:42 +0000
commit8c6119a44275852b868c6df0c14ee85efeb2a9e5 (patch)
tree86c6dca212d30da5c4768eeabb68af088ddf57b4 /clang/test/Analysis/smart-ptr.cpp
parent32c0ebe615772f25b4cadb82bc3ad809afa62641 (diff)
downloadbcm5719-llvm-8c6119a44275852b868c6df0c14ee85efeb2a9e5.tar.gz
bcm5719-llvm-8c6119a44275852b868c6df0c14ee85efeb2a9e5.zip
[analyzer] PR41269: Add a bit of C++ smart pointer modeling.
Implement cplusplus.SmartPtrModeling, a new checker that doesn't emit any warnings but models methods of smart pointers more precisely. For now the only thing it does is make `(bool) P` return false when `P` is a freshly moved pointer. This addresses a false positive in the use-after-move-checker. Differential Revision: https://reviews.llvm.org/D60796 llvm-svn: 358944
Diffstat (limited to 'clang/test/Analysis/smart-ptr.cpp')
-rw-r--r--clang/test/Analysis/smart-ptr.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/test/Analysis/smart-ptr.cpp b/clang/test/Analysis/smart-ptr.cpp
new file mode 100644
index 00000000000..3f1782480b4
--- /dev/null
+++ b/clang/test/Analysis/smart-ptr.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection\
+// RUN: -analyzer-checker cplusplus.Move,cplusplus.SmartPtr\
+// RUN: -std=c++11 -verify %s
+
+#include "Inputs/system-header-simulator-cxx.h"
+
+void clang_analyzer_warnIfReached();
+
+void derefAfterMove(std::unique_ptr<int> P) {
+ std::unique_ptr<int> Q = std::move(P);
+ if (Q)
+ clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
+ *Q.get() = 1; // no-warning
+ if (P)
+ clang_analyzer_warnIfReached(); // no-warning
+ // TODO: Report a null dereference (instead).
+ *P.get() = 1; // expected-warning {{Method called on moved-from object 'P'}}
+}
OpenPOWER on IntegriCloud