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.