//===--- OpaqueSTLFunctionsModeling.cpp -----------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // Models STL functions whose best accurate model is to invalidate their // arguments. Only functions where this simple approach is sufficient and won't // interfere with the modeling of other checkers should be put here. // //===----------------------------------------------------------------------===// #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" #include "clang/StaticAnalyzer/Core/Checker.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; namespace { class OpaqueSTLFunctionsModeling : public Checker { public: bool evalCall(const CallEvent &Call, CheckerContext &C) const; private: const CallDescriptionSet ModeledFunctions{ {CDM::SimpleFunc, {"std", "sort"}}, {CDM::SimpleFunc, {"std", "stable_sort"}}, {CDM::SimpleFunc, {"std", "inplace_merge"}}}; }; } // namespace bool OpaqueSTLFunctionsModeling::evalCall(const CallEvent &Call, CheckerContext &C) const { if (!ModeledFunctions.contains(Call)) return false; ProgramStateRef InvalidatedRegionsState = Call.invalidateRegions(C.blockCount(), C.getState()); C.addTransition(InvalidatedRegionsState); return true; } void ento::registerOpaqueSTLFunctionsModeling(CheckerManager &Mgr) { Mgr.registerChecker(); } bool ento::shouldRegisterOpaqueSTLFunctionsModeling(const CheckerManager &Mgr) { return Mgr.getLangOpts().CPlusPlus; }