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/ADT/SmallVector.h"
26#include "llvm/Support/FormatVariadic.h"
27#include
28
29using namespace clang;
30using namespace ento;
31using llvm::formatv;
32
33namespace {
34class ReturnValueChecker : public Checkercheck::PostCall {
35public:
37
38private:
40
41 {CDM::CXXMethod, {"ARMAsmParser", "Error"}},
42 {CDM::CXXMethod, {"HexagonAsmParser", "Error"}},
43 {CDM::CXXMethod, {"LLLexer", "Error"}},
44 {CDM::CXXMethod, {"LLParser", "Error"}},
45 {CDM::CXXMethod, {"MCAsmParser", "Error"}},
46 {CDM::CXXMethod, {"MCAsmParserExtension", "Error"}},
47 {CDM::CXXMethod, {"TGParser", "Error"}},
48 {CDM::CXXMethod, {"X86AsmParser", "Error"}},
49
50 {CDM::CXXMethod, {"LLParser", "TokError"}},
51 {CDM::CXXMethod, {"MCAsmParser", "TokError"}},
52 {CDM::CXXMethod, {"MCAsmParserExtension", "TokError"}},
53 {CDM::CXXMethod, {"TGParser", "TokError"}},
54
55 {CDM::CXXMethod, {"MIParser", "error"}},
56 {CDM::CXXMethod, {"WasmAsmParser", "error"}},
57 {CDM::CXXMethod, {"WebAssemblyAsmParser", "error"}},
58
59 {CDM::CXXMethod, {"AsmParser", "printError"}}};
60};
61}
62
64 std::string Name;
65 if (const auto *MD = dyn_cast(Call.getDecl()))
67 Name += RD->getNameAsString() + "::";
68
69 Name += Call.getCalleeIdentifier()->getName();
70 return Name;
71}
72
73void ReturnValueChecker::checkPostCall(const CallEvent &Call,
75 if (!Methods.contains(Call))
76 return;
77
79
80 if (!ReturnV)
81 return;
82
84 if (ProgramStateRef StTrue = State->assume(*ReturnV, true)) {
85
86 std::string Msg =
87 formatv("'{0}' returns true (by convention)", getName(Call));
88 C.addTransition(StTrue, C.getNoteTag(Msg, true));
89 return;
90 }
91
92
93
94
95 std::string Msg = formatv("'{0}' returned false, breaking the convention "
96 "that it always returns true",
98 C.addTransition(State, C.getNoteTag(Msg, true));
99}
100
101void ento::registerReturnValueChecker(CheckerManager &Mgr) {
103}
104
105bool ento::shouldRegisterReturnValueChecker(const CheckerManager &mgr) {
106 return true;
107}
static std::string getName(const CallEvent &Call)
Represents a C++ struct/union/class.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
An immutable set of CallDescriptions.
Represents an abstract call to a function or method along a particular path.
CHECKER * registerChecker(AT &&... Args)
Used to register checkers.
The JSON file list parser is used to communicate input to InstallAPI.