10#include "clang/AST/ASTContext.h"
11#include "clang/ASTMatchers/ASTMatchFinder.h"
12#include "clang/Frontend/CompilerInstance.h"
13#include "clang/Lex/PPCallbacks.h"
14#include "clang/Lex/Preprocessor.h"
21const char DiagWording[] =
22 "do not call %0; consider using exception handling instead";
24class SetJmpMacroCallbacks :
public PPCallbacks {
25 AvoidSetjmpLongjmpCheck &Check;
28 explicit SetJmpMacroCallbacks(AvoidSetjmpLongjmpCheck &Check)
31 void MacroExpands(
const Token &MacroNameTok,
const MacroDefinition &MD,
32 SourceRange Range,
const MacroArgs *Args)
override {
33 const auto *II = MacroNameTok.getIdentifierInfo();
37 if (II->getName() ==
"setjmp")
38 Check.diag(Range.getBegin(), DiagWording) << II;
44 const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
47 PP->addPPCallbacks(std::make_unique<SetJmpMacroCallbacks>(*
this));
55 callExpr(callee(functionDecl(hasAnyName(
"setjmp",
"longjmp"))))
61 const auto *E = Result.Nodes.getNodeAs<CallExpr>(
"expr");
62 diag(E->getExprLoc(), DiagWording) << cast<NamedDecl>(E->getCalleeDecl());
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) override
void check(const ast_matchers::MatchFinder::MatchResult &Result) override
void registerMatchers(ast_matchers::MatchFinder *Finder) override