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 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits