spaits created this revision. spaits added reviewers: Szelethus, steakhal, NoQ, gamesh411, xazax.hun. spaits added a project: clang. Herald added subscribers: manas, ASDenysPetrov, martong, dkrupp, donat.nagy, mikhail.ramalho, a.sidorin, rnkovacs, szepet, baloghadamsoftware. Herald added a project: All. spaits requested review of this revision. Herald added a subscriber: cfe-commits.
As per the discussion on this thread i have started working on an std::variant checker. https://discourse.llvm.org/t/analyzer-new-checker-for-std-any-as-a-bsc-thesis/65613/2 This patch is mostly a conversation starter. @Szelethus will supervise me on this project, and we shall discuss our next steps here. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D142354 Files: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt clang/lib/StaticAnalyzer/Checkers/StdVariantChecker.cpp clang/test/Analysis/std-variant-checker.cpp Index: clang/test/Analysis/std-variant-checker.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/std-variant-checker.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.StdVariant %s -verify + +namespace std { + template<class... Types> + class variant {}; +} //end of namespace std + +void g() { + std::variant<int, char> v; // expected-warning{{Variant Created [alpha.core.StdVariant]}} +} \ No newline at end of file Index: clang/lib/StaticAnalyzer/Checkers/StdVariantChecker.cpp =================================================================== --- /dev/null +++ clang/lib/StaticAnalyzer/Checkers/StdVariantChecker.cpp @@ -0,0 +1,51 @@ +//===- StdVariantChecker.cpp -------------------------------------*- C++ -*-==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" +#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" +#include "clang/StaticAnalyzer/Core/Checker.h" +#include "clang/StaticAnalyzer/Core/CheckerManager.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" + +using namespace clang; +using namespace ento; + +class StdVariantChecker : public Checker<check::PreCall> { + CallDescription VariantConstructorCall{{"std", "variant"}, 0, 0}; + BugType VariantCreated{this, "VariantCreated", "VariantCreated"}; + + public: + void checkPreCall(const CallEvent &Call, CheckerContext &C) const { + if (!isa<CXXConstructorCall>(Call)) + return; + + if (!VariantConstructorCall.matches(Call)) + return; + + ExplodedNode* ErrNode = C.generateNonFatalErrorNode(); + if (!ErrNode) + return; + llvm::SmallString<128> Str; + llvm::raw_svector_ostream OS(Str); + OS << "Variant Created"; + auto R = std::make_unique<PathSensitiveBugReport>( + VariantCreated, OS.str(), ErrNode); + C.emitReport(std::move(R)); + } +}; + +bool clang::ento::shouldRegisterStdVariantChecker( + clang::ento::CheckerManager const &mgr) { + return true; +} + +void clang::ento::registerStdVariantChecker(clang::ento::CheckerManager &mgr) { + mgr.registerChecker<StdVariantChecker>(); +} \ No newline at end of file Index: clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt =================================================================== --- clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt +++ clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt @@ -107,6 +107,7 @@ SmartPtrModeling.cpp StackAddrEscapeChecker.cpp StdLibraryFunctionsChecker.cpp + StdVariantChecker.cpp STLAlgorithmModeling.cpp StreamChecker.cpp StringChecker.cpp Index: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td =================================================================== --- clang/include/clang/StaticAnalyzer/Checkers/Checkers.td +++ clang/include/clang/StaticAnalyzer/Checkers/Checkers.td @@ -305,6 +305,10 @@ Dependencies<[PthreadLockBase]>, Documentation<HasDocumentation>; +def StdVariantChecker : Checker<"StdVariant">, + HelpText<"Check std::variant">, + Documentation<NotDocumented>; + } // end "alpha.core" //===----------------------------------------------------------------------===//
Index: clang/test/Analysis/std-variant-checker.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/std-variant-checker.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.StdVariant %s -verify + +namespace std { + template<class... Types> + class variant {}; +} //end of namespace std + +void g() { + std::variant<int, char> v; // expected-warning{{Variant Created [alpha.core.StdVariant]}} +} \ No newline at end of file Index: clang/lib/StaticAnalyzer/Checkers/StdVariantChecker.cpp =================================================================== --- /dev/null +++ clang/lib/StaticAnalyzer/Checkers/StdVariantChecker.cpp @@ -0,0 +1,51 @@ +//===- StdVariantChecker.cpp -------------------------------------*- C++ -*-==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" +#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" +#include "clang/StaticAnalyzer/Core/Checker.h" +#include "clang/StaticAnalyzer/Core/CheckerManager.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" + +using namespace clang; +using namespace ento; + +class StdVariantChecker : public Checker<check::PreCall> { + CallDescription VariantConstructorCall{{"std", "variant"}, 0, 0}; + BugType VariantCreated{this, "VariantCreated", "VariantCreated"}; + + public: + void checkPreCall(const CallEvent &Call, CheckerContext &C) const { + if (!isa<CXXConstructorCall>(Call)) + return; + + if (!VariantConstructorCall.matches(Call)) + return; + + ExplodedNode* ErrNode = C.generateNonFatalErrorNode(); + if (!ErrNode) + return; + llvm::SmallString<128> Str; + llvm::raw_svector_ostream OS(Str); + OS << "Variant Created"; + auto R = std::make_unique<PathSensitiveBugReport>( + VariantCreated, OS.str(), ErrNode); + C.emitReport(std::move(R)); + } +}; + +bool clang::ento::shouldRegisterStdVariantChecker( + clang::ento::CheckerManager const &mgr) { + return true; +} + +void clang::ento::registerStdVariantChecker(clang::ento::CheckerManager &mgr) { + mgr.registerChecker<StdVariantChecker>(); +} \ No newline at end of file Index: clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt =================================================================== --- clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt +++ clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt @@ -107,6 +107,7 @@ SmartPtrModeling.cpp StackAddrEscapeChecker.cpp StdLibraryFunctionsChecker.cpp + StdVariantChecker.cpp STLAlgorithmModeling.cpp StreamChecker.cpp StringChecker.cpp Index: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td =================================================================== --- clang/include/clang/StaticAnalyzer/Checkers/Checkers.td +++ clang/include/clang/StaticAnalyzer/Checkers/Checkers.td @@ -305,6 +305,10 @@ Dependencies<[PthreadLockBase]>, Documentation<HasDocumentation>; +def StdVariantChecker : Checker<"StdVariant">, + HelpText<"Check std::variant">, + Documentation<NotDocumented>; + } // end "alpha.core" //===----------------------------------------------------------------------===//
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits