clang: lib/StaticAnalyzer/Checkers/ReturnValueChecker.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
25#include "llvm/Support/FormatVariadic.h"
26#include
27
28using namespace clang;
29using namespace ento;
30using llvm::formatv;
31
32namespace {
33class ReturnValueChecker : public Checkercheck::PostCall {
34public:
35 void checkPostCall(const CallEvent &Call, CheckerContext &C) const;
36
37private:
38 const CallDescriptionSet Methods = {
39
40 {CDM::CXXMethod, {"ARMAsmParser", "Error"}},
41 {CDM::CXXMethod, {"HexagonAsmParser", "Error"}},
42 {CDM::CXXMethod, {"LLLexer", "Error"}},
43 {CDM::CXXMethod, {"LLParser", "Error"}},
44 {CDM::CXXMethod, {"MCAsmParser", "Error"}},
45 {CDM::CXXMethod, {"MCAsmParserExtension", "Error"}},
46 {CDM::CXXMethod, {"TGParser", "Error"}},
47 {CDM::CXXMethod, {"X86AsmParser", "Error"}},
48
49 {CDM::CXXMethod, {"LLParser", "TokError"}},
50 {CDM::CXXMethod, {"MCAsmParser", "TokError"}},
51 {CDM::CXXMethod, {"MCAsmParserExtension", "TokError"}},
52 {CDM::CXXMethod, {"TGParser", "TokError"}},
53
54 {CDM::CXXMethod, {"MIParser", "error"}},
55 {CDM::CXXMethod, {"WasmAsmParser", "error"}},
56 {CDM::CXXMethod, {"WebAssemblyAsmParser", "error"}},
57
58 {CDM::CXXMethod, {"AsmParser", "printError"}}};
59};
60}
61
63 std::string Name;
64 if (const auto *MD = dyn_cast(Call.getDecl()))
66 Name += RD->getNameAsString() + "::";
67
68 Name += Call.getCalleeIdentifier()->getName();
69 return Name;
70}
71
72void ReturnValueChecker::checkPostCall(const CallEvent &Call,
75 return;
76
77 auto ReturnV = Call.getReturnValue().getAs();
78
79 if (!ReturnV)
80 return;
81
83 if (ProgramStateRef StTrue = State->assume(*ReturnV, true)) {
84
85 std::string Msg =
87 C.addTransition(StTrue, C.getNoteTag(Msg, true));
88 return;
89 }
90
91
92
93
94 std::string Msg = formatv("'{0}' returned false, breaking the convention "
95 "that it always returns true",
97 C.addTransition(State, C.getNoteTag(Msg, true));
98}
99
100void ento::registerReturnValueChecker(CheckerManager &Mgr) {
102}
103
104bool ento::shouldRegisterReturnValueChecker(const CheckerManager &mgr) {
105 return true;
106}
static std::string getFunctionName(const CallEvent &Call)
Definition ReturnValueChecker.cpp:62
Represents a C++ struct/union/class.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool contains(const CallEvent &Call) const
Represents an abstract call to a function or method along a particular path.
CHECKER * registerChecker(AT &&...Args)
Register a single-part checker (derived from Checker): construct its singleton instance,...
Simple checker classes that implement one frontend (i.e.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
The JSON file list parser is used to communicate input to InstallAPI.