[clang] 8d3c960 - Revert "[clang][dataflow] Store DeclContext of block being analysed in Environment if available."
Evgenii Stepanov via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 10 14:30:06 PDT 2022
Author: Evgenii Stepanov
Date: 2022-08-10T14:22:04-07:00
New Revision: 8d3c9602959df4caadfade1f40512231f7d6bbe8
URL: https://github.com/llvm/llvm-project/commit/8d3c9602959df4caadfade1f40512231f7d6bbe8
DIFF: https://github.com/llvm/llvm-project/commit/8d3c9602959df4caadfade1f40512231f7d6bbe8.diff
LOG: Revert "[clang][dataflow] Store DeclContext of block being analysed in Environment if available."
Use of uninitialized memory.
https://lab.llvm.org/buildbot/#/builders/74/builds/12713
This reverts commit 8a4c40bfe8e6605ffc9d866f8620618dfdde2875.
Added:
Modified:
clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h b/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
index 1b154010bf365..fc43b6b43575f 100644
--- a/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
+++ b/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
@@ -347,13 +347,6 @@ class Environment {
/// imply that `Val` is true.
bool flowConditionImplies(BoolValue &Val) const;
- /// Returns the `DeclContext` of the block being analysed, if any. Otherwise,
- /// returns null.
- const DeclContext *getDeclCtx() { return DeclCtx; }
-
- /// Sets the `DeclContext` of the block being analysed.
- void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; }
-
/// Returns the `ControlFlowContext` registered for `F`, if any. Otherwise,
/// returns null.
const ControlFlowContext *getControlFlowContext(const FunctionDecl *F) {
@@ -384,9 +377,6 @@ class Environment {
// `DACtx` is not null and not owned by this object.
DataflowAnalysisContext *DACtx;
- // `DeclContext` of the block being analysed if provided.
- const DeclContext *DeclCtx;
-
// In a properly initialized `Environment`, `ReturnLoc` should only be null if
// its `DeclContext` could not be cast to a `FunctionDecl`.
StorageLocation *ReturnLoc = nullptr;
diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
index 16c83cad9d9e3..ff27a2a45179b 100644
--- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
+++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
@@ -154,7 +154,7 @@ Environment::Environment(DataflowAnalysisContext &DACtx)
: DACtx(&DACtx), FlowConditionToken(&DACtx.makeFlowConditionToken()) {}
Environment::Environment(const Environment &Other)
- : DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), ReturnLoc(Other.ReturnLoc),
+ : DACtx(Other.DACtx), ReturnLoc(Other.ReturnLoc),
ThisPointeeLoc(Other.ThisPointeeLoc), DeclToLoc(Other.DeclToLoc),
ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal),
MemberLocToStruct(Other.MemberLocToStruct),
@@ -168,11 +168,9 @@ Environment &Environment::operator=(const Environment &Other) {
}
Environment::Environment(DataflowAnalysisContext &DACtx,
- const DeclContext &DeclCtxArg)
+ const DeclContext &DeclCtx)
: Environment(DACtx) {
- setDeclCtx(&DeclCtxArg);
-
- if (const auto *FuncDecl = dyn_cast<FunctionDecl>(DeclCtx)) {
+ if (const auto *FuncDecl = dyn_cast<FunctionDecl>(&DeclCtx)) {
assert(FuncDecl->getBody() != nullptr);
initGlobalVars(*FuncDecl->getBody(), *this);
for (const auto *ParamDecl : FuncDecl->parameters()) {
@@ -187,7 +185,7 @@ Environment::Environment(DataflowAnalysisContext &DACtx,
ReturnLoc = &createStorageLocation(ReturnType);
}
- if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclCtx)) {
+ if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(&DeclCtx)) {
auto *Parent = MethodDecl->getParent();
assert(Parent != nullptr);
if (Parent->isLambda())
@@ -212,9 +210,6 @@ Environment Environment::pushCall(const CallExpr *Call) const {
const auto *FuncDecl = Call->getDirectCallee();
assert(FuncDecl != nullptr);
-
- Env.setDeclCtx(FuncDecl);
-
// FIXME: In order to allow the callee to reference globals, we probably need
// to call `initGlobalVars` here in some way.
@@ -257,12 +252,12 @@ Environment Environment::pushCall(const CallExpr *Call) const {
void Environment::popCall(const Environment &CalleeEnv) {
// We ignore `DACtx` because it's already the same in both. We don't want the
- // callee's `DeclCtx`, `ReturnLoc` or `ThisPointeeLoc`. We don't bring back
- // `DeclToLoc` and `ExprToLoc` because we want to be able to later analyze the
- // same callee in a
diff erent context, and `setStorageLocation` requires there
- // to not already be a storage location assigned. Conceptually, these maps
- // capture information from the local scope, so when popping that scope, we do
- // not propagate the maps.
+ // callee's `ReturnLoc` or `ThisPointeeLoc`. We don't bring back `DeclToLoc`
+ // and `ExprToLoc` because we want to be able to later analyze the same callee
+ // in a
diff erent context, and `setStorageLocation` requires there to not
+ // already be a storage location assigned. Conceptually, these maps capture
+ // information from the local scope, so when popping that scope, we do not
+ // propagate the maps.
this->LocToVal = std::move(CalleeEnv.LocToVal);
this->MemberLocToStruct = std::move(CalleeEnv.MemberLocToStruct);
this->FlowConditionToken = std::move(CalleeEnv.FlowConditionToken);
@@ -309,13 +304,11 @@ LatticeJoinEffect Environment::join(const Environment &Other,
assert(DACtx == Other.DACtx);
assert(ReturnLoc == Other.ReturnLoc);
assert(ThisPointeeLoc == Other.ThisPointeeLoc);
- assert(DeclCtx == Other.DeclCtx);
auto Effect = LatticeJoinEffect::Unchanged;
Environment JoinedEnv(*DACtx);
- JoinedEnv.setDeclCtx(DeclCtx);
JoinedEnv.ReturnLoc = ReturnLoc;
JoinedEnv.ThisPointeeLoc = ThisPointeeLoc;
More information about the cfe-commits
mailing list