[llvm-branch-commits] [clang] c47780a - Revert "[analyzer] Delay the checker constructions after parsing (#127409)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Feb 22 02:42:44 PST 2025
Author: Balazs Benics
Date: 2025-02-22T11:42:41+01:00
New Revision: c47780aa45385a617e9beeb032896beebb2f3411
URL: https://github.com/llvm/llvm-project/commit/c47780aa45385a617e9beeb032896beebb2f3411
DIFF: https://github.com/llvm/llvm-project/commit/c47780aa45385a617e9beeb032896beebb2f3411.diff
LOG: Revert "[analyzer] Delay the checker constructions after parsing (#127409)"
This reverts commit f0088ee87cecfb442921251b4a70f96cf3474a15.
Added:
Modified:
clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
Removed:
################################################################################
diff --git a/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
index 10dfa73cc522d..da2d16ca9b5dd 100644
--- a/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
@@ -40,28 +40,17 @@ enum class OpenVariant {
OpenAt
};
-static std::optional<int> getCreateFlagValue(const ASTContext &Ctx,
- const Preprocessor &PP) {
- std::optional<int> MacroVal = tryExpandAsInteger("O_CREAT", PP);
- if (MacroVal.has_value())
- return MacroVal;
-
- // If we failed, fall-back to known values.
- if (Ctx.getTargetInfo().getTriple().getVendor() == llvm::Triple::Apple)
- return {0x0200};
- return MacroVal;
-}
-
namespace {
-class UnixAPIMisuseChecker : public Checker<check::PreCall> {
+class UnixAPIMisuseChecker
+ : public Checker<check::PreCall, check::ASTDecl<TranslationUnitDecl>> {
const BugType BT_open{this, "Improper use of 'open'", categories::UnixAPI};
const BugType BT_getline{this, "Improper use of getdelim",
categories::UnixAPI};
const BugType BT_pthreadOnce{this, "Improper use of 'pthread_once'",
categories::UnixAPI};
const BugType BT_ArgumentNull{this, "NULL pointer", categories::UnixAPI};
- const std::optional<int> Val_O_CREAT;
+ mutable std::optional<uint64_t> Val_O_CREAT;
ProgramStateRef
EnsurePtrNotNull(SVal PtrVal, const Expr *PtrExpr, CheckerContext &C,
@@ -74,9 +63,6 @@ class UnixAPIMisuseChecker : public Checker<check::PreCall> {
const Expr *SizePtrExpr, CheckerContext &C, ProgramStateRef State) const;
public:
- UnixAPIMisuseChecker(const ASTContext &Ctx, const Preprocessor &PP)
- : Val_O_CREAT(getCreateFlagValue(Ctx, PP)) {}
-
void checkASTDecl(const TranslationUnitDecl *TU, AnalysisManager &Mgr,
BugReporter &BR) const;
@@ -148,6 +134,20 @@ ProgramStateRef UnixAPIMisuseChecker::EnsurePtrNotNull(
return PtrNotNull;
}
+void UnixAPIMisuseChecker::checkASTDecl(const TranslationUnitDecl *TU,
+ AnalysisManager &Mgr,
+ BugReporter &) const {
+ // The definition of O_CREAT is platform specific.
+ // Try to get the macro value from the preprocessor.
+ Val_O_CREAT = tryExpandAsInteger("O_CREAT", Mgr.getPreprocessor());
+ // If we failed, fall-back to known values.
+ if (!Val_O_CREAT) {
+ if (TU->getASTContext().getTargetInfo().getTriple().getVendor() ==
+ llvm::Triple::Apple)
+ Val_O_CREAT = 0x0200;
+ }
+}
+
//===----------------------------------------------------------------------===//
// "open" (man 2 open)
//===----------------------------------------------------------------------===/
@@ -262,7 +262,7 @@ void UnixAPIMisuseChecker::CheckOpenVariant(CheckerContext &C,
return;
}
- if (!Val_O_CREAT.has_value()) {
+ if (!Val_O_CREAT) {
return;
}
@@ -276,7 +276,7 @@ void UnixAPIMisuseChecker::CheckOpenVariant(CheckerContext &C,
}
NonLoc oflags = V.castAs<NonLoc>();
NonLoc ocreateFlag = C.getSValBuilder()
- .makeIntVal(Val_O_CREAT.value(), oflagsEx->getType())
+ .makeIntVal(*Val_O_CREAT, oflagsEx->getType())
.castAs<NonLoc>();
SVal maskedFlagsUC = C.getSValBuilder().evalBinOpNN(state, BO_And,
oflags, ocreateFlag,
@@ -621,17 +621,14 @@ void UnixAPIPortabilityChecker::checkPreStmt(const CallExpr *CE,
// Registration.
//===----------------------------------------------------------------------===//
-void ento::registerUnixAPIMisuseChecker(CheckerManager &Mgr) {
- Mgr.registerChecker<UnixAPIMisuseChecker>(Mgr.getASTContext(),
- Mgr.getPreprocessor());
-}
-bool ento::shouldRegisterUnixAPIMisuseChecker(const CheckerManager &Mgr) {
- return true;
-}
+#define REGISTER_CHECKER(CHECKERNAME) \
+ void ento::register##CHECKERNAME(CheckerManager &mgr) { \
+ mgr.registerChecker<CHECKERNAME>(); \
+ } \
+ \
+ bool ento::shouldRegister##CHECKERNAME(const CheckerManager &mgr) { \
+ return true; \
+ }
-void ento::registerUnixAPIPortabilityChecker(CheckerManager &Mgr) {
- Mgr.registerChecker<UnixAPIPortabilityChecker>();
-}
-bool ento::shouldRegisterUnixAPIPortabilityChecker(const CheckerManager &Mgr) {
- return true;
-}
+REGISTER_CHECKER(UnixAPIMisuseChecker)
+REGISTER_CHECKER(UnixAPIPortabilityChecker)
diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index db177b584b4f5..189d7d6bede8e 100644
--- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -224,6 +224,16 @@ class AnalysisConsumer : public AnalysisASTConsumer,
}
}
+ void Initialize(ASTContext &Context) override {
+ Ctx = &Context;
+ checkerMgr = std::make_unique<CheckerManager>(*Ctx, Opts, PP, Plugins,
+ CheckerRegistrationFns);
+
+ Mgr = std::make_unique<AnalysisManager>(*Ctx, PP, PathConsumers,
+ CreateStoreMgr, CreateConstraintMgr,
+ checkerMgr.get(), Opts, Injector);
+ }
+
/// Store the top level decls in the set to be processed later on.
/// (Doing this pre-processing avoids deserialization of data from PCH.)
bool HandleTopLevelDecl(DeclGroupRef D) override;
@@ -605,14 +615,6 @@ void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
if (Diags.hasErrorOccurred() || Diags.hasFatalErrorOccurred())
return;
- Ctx = &C;
- checkerMgr = std::make_unique<CheckerManager>(*Ctx, Opts, PP, Plugins,
- CheckerRegistrationFns);
-
- Mgr = std::make_unique<AnalysisManager>(*Ctx, PP, PathConsumers,
- CreateStoreMgr, CreateConstraintMgr,
- checkerMgr.get(), Opts, Injector);
-
// Explicitly destroy the PathDiagnosticConsumer. This will flush its output.
// FIXME: This should be replaced with something that doesn't rely on
// side-effects in PathDiagnosticConsumer's destructor. This is required when
More information about the llvm-branch-commits
mailing list