From 676fbe8105eeb6ff4bb2ed261cb212fcfdbe7b63 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sat, 19 Jan 2019 10:04:05 +0000 Subject: Vendor import of clang trunk r351319 (just before the release_80 branch point): https://llvm.org/svn/llvm-project/cfe/trunk@351319 --- .../StaticAnalyzer/RegisterCustomCheckersTest.cpp | 56 +++++++++++++++------- 1 file changed, 40 insertions(+), 16 deletions(-) (limited to 'unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp') diff --git a/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp b/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp index dcd115e59631..568a719e3366 100644 --- a/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp +++ b/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp @@ -11,9 +11,9 @@ #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" #include "clang/StaticAnalyzer/Core/Checker.h" -#include "clang/StaticAnalyzer/Core/CheckerRegistry.h" #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" #include "clang/StaticAnalyzer/Frontend/AnalysisConsumer.h" +#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h" #include "clang/Tooling/Tooling.h" #include "gtest/gtest.h" @@ -21,16 +21,7 @@ namespace clang { namespace ento { namespace { -class CustomChecker : public Checker { -public: - void checkASTCodeBody(const Decl *D, AnalysisManager &Mgr, - BugReporter &BR) const { - BR.EmitBasicReport(D, this, "Custom diagnostic", categories::LogicError, - "Custom diagnostic description", - PathDiagnosticLocation(D, Mgr.getSourceManager()), {}); - } -}; - +template class TestAction : public ASTFrontendAction { class DiagConsumer : public PathDiagnosticConsumer { llvm::raw_ostream &Output; @@ -59,22 +50,55 @@ public: Compiler.getAnalyzerOpts()->CheckersControlList = { {"custom.CustomChecker", true}}; AnalysisConsumer->AddCheckerRegistrationFn([](CheckerRegistry &Registry) { - Registry.addChecker("custom.CustomChecker", "Description"); + Registry.addChecker("custom.CustomChecker", "Description", ""); }); return std::move(AnalysisConsumer); } }; +template +bool runCheckerOnCode(const std::string &Code, std::string &Diags) { + llvm::raw_string_ostream OS(Diags); + return tooling::runToolOnCode(new TestAction(OS), Code); +} +template +bool runCheckerOnCode(const std::string &Code) { + std::string Diags; + return runCheckerOnCode(Code, Diags); +} + + +class CustomChecker : public Checker { +public: + void checkASTCodeBody(const Decl *D, AnalysisManager &Mgr, + BugReporter &BR) const { + BR.EmitBasicReport(D, this, "Custom diagnostic", categories::LogicError, + "Custom diagnostic description", + PathDiagnosticLocation(D, Mgr.getSourceManager()), {}); + } +}; TEST(RegisterCustomCheckers, RegisterChecker) { std::string Diags; - { - llvm::raw_string_ostream OS(Diags); - EXPECT_TRUE(tooling::runToolOnCode(new TestAction(OS), "void f() {;}")); - } + EXPECT_TRUE(runCheckerOnCode("void f() {;}", Diags)); EXPECT_EQ(Diags, "custom.CustomChecker:Custom diagnostic description"); } +class LocIncDecChecker : public Checker { +public: + void checkLocation(SVal Loc, bool IsLoad, const Stmt *S, + CheckerContext &C) const { + auto UnaryOp = dyn_cast(S); + if (UnaryOp && !IsLoad) + EXPECT_FALSE(UnaryOp->isIncrementOp()); + } +}; + +TEST(RegisterCustomCheckers, CheckLocationIncDec) { + EXPECT_TRUE( + runCheckerOnCode("void f() { int *p; (*p)++; }")); +} + } } } -- cgit v1.3