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.