From: Evgenii Stepanov Date: Wed, 10 Aug 2022 21:20:57 +0000 (-0700) Subject: Revert "[clang][dataflow] Store DeclContext of block being analysed in Environment... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8d3c9602959df4caadfade1f40512231f7d6bbe8;p=platform%2Fupstream%2Fllvm.git 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. --- diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h b/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h index 1b15401..fc43b6b 100644 --- a/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ b/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -347,13 +347,6 @@ public: /// 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 @@ private: // `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 16c83ca..ff27a2a 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(DeclCtx)) { + if (const auto *FuncDecl = dyn_cast(&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(DeclCtx)) { + if (const auto *MethodDecl = dyn_cast(&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 different 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 different 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;