From 8c6119a44275852b868c6df0c14ee85efeb2a9e5 Mon Sep 17 00:00:00 2001 From: Artem Dergachev Date: Tue, 23 Apr 2019 02:45:42 +0000 Subject: [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 --- clang/test/Analysis/smart-ptr.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 clang/test/Analysis/smart-ptr.cpp (limited to 'clang/test/Analysis/smart-ptr.cpp') 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 P) { + std::unique_ptr 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'}} +} -- cgit v1.2.3