[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