[clang] [clang][dataflow] Fully support Environment construction for Stmt analysis. (PR #91616)

Samira Bazuzi via cfe-commits cfe-commits at lists.llvm.org
Wed May 15 08:43:57 PDT 2024


================
@@ -164,23 +169,28 @@ class Environment {
   Environment &operator=(Environment &&Other) = default;
 
   /// Creates an environment that uses `DACtx` to store objects that encompass
-  /// the state of a program.
-  ///
-  /// If `DeclCtx` is a function, initializes the environment with symbolic
-  /// representations of the function parameters.
-  ///
-  /// If `DeclCtx` is a non-static member function, initializes the environment
-  /// with a symbolic representation of the `this` pointee.
-  Environment(DataflowAnalysisContext &DACtx, const DeclContext &DeclCtx);
+  /// the state of a program, with `S` as the initial analysis target.
+  Environment(DataflowAnalysisContext &DACtx, Stmt &S) : Environment(DACtx) {
+    InitialTargetStmt = &S;
+  }
 
-  /// Assigns storage locations and values to all parameters, captures, global
-  /// variables, fields and functions referenced in the function currently being
-  /// analyzed.
+  /// Creates an environment that uses `DACtx` to store objects that encompass
+  /// the state of a program, with `FD` as the initial analysis target.
   ///
   /// Requirements:
   ///
   ///  The function must have a body, i.e.
   ///  `FunctionDecl::doesThisDecalarationHaveABody()` must be true.
+  Environment(DataflowAnalysisContext &DACtx, const FunctionDecl &FD)
+      : Environment(DACtx, *FD.getBody()) {
+    InitialTargetFunc = &FD;
+  }
+
+  /// Assigns storage locations and values to all parameters, captures, global
+  /// variables, fields and functions referenced in the initial analysis target.
+  ///
+  /// If the target is a non-static member function, initializes the environment
+  /// with a symbolic representation of the `this` pointee.
   void initialize();
----------------
bazuzi wrote:

The call stack being assumed non-empty was the case previously. Now these two are not technically on the call stack, and the function will no longer crash if called without InitialTargetStmt being non-null. It just doesn't do anything. Updated the comment to indicate this.

https://github.com/llvm/llvm-project/pull/91616


More information about the cfe-commits mailing list