-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Revert "[analyzer] Delay the checker constructions after parsing" #128350
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Revert "[analyzer] Delay the checker constructions after parsing" #128350
Conversation
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-static-analyzer-1 Author: Balazs Benics (steakhal) ChangesReverts llvm/llvm-project#127409 This caused a test failure: LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/55/builds/7431 <details>
</details> Full diff: https://github.com/llvm/llvm-project/pull/128350.diff 2 Files Affected:
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
|
…lvm#128350) This reverts commit db836ed.
Reverts #127409
This caused a test failure:
LLVM Buildbot has detected a new failure on builder
sanitizer-aarch64-linux-bootstrap-hwasan
running onsanitizer-buildbot11
while buildingclang
at step 2 "annotate".Full details are available at: https://lab.llvm.org/buildbot/#/builders/55/builds/7431
Here is the relevant piece of the build log for the reference