Skip to content

Conversation

@necto
Copy link
Contributor

@necto necto commented Aug 21, 2025

Improve const-correctness of CheckerContext API by defining the missing const overloads to its accessor member functions.

This NFC change is triggered by a work on a downstream checker that operated on a const CheckerConst& C most of the time, but needed C.getPredecessor() at one point, which forced me to remove const from many places.

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:static analyzer labels Aug 21, 2025
@llvmbot
Copy link
Member

llvmbot commented Aug 21, 2025

@llvm/pr-subscribers-clang

Author: Arseniy Zaostrovnykh (necto)

Changes

Improve const-correctness of CheckerContext API by defining the missing const overloads to its accessor member functions.

This NFC change is triggered by a work on a downstream checker that operated on a const CheckerConst& C most of the time, but needed C.getPredecessor() at one point, which forced me to remove const from many places.


Full diff: https://github.com/llvm/llvm-project/pull/154741.diff

4 Files Affected:

  • (modified) clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h (+2)
  • (modified) clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h (+27)
  • (modified) clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h (+9)
  • (modified) clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h (+2)
diff --git a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h index 19535e6bac4d5..f6a023368f3d2 100644 --- a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h +++ b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h @@ -623,10 +623,12 @@ class BugReporter { ASTContext &getContext() { return D.getASTContext(); } const SourceManager &getSourceManager() { return D.getSourceManager(); } + const SourceManager &getSourceManager() const { return D.getSourceManager(); } const AnalyzerOptions &getAnalyzerOptions() { return D.getAnalyzerOptions(); } Preprocessor &getPreprocessor() { return D.getPreprocessor(); } + const Preprocessor &getPreprocessor() const { return D.getPreprocessor(); } /// Get the top-level entry point for the issue to be reported. const Decl *getAnalysisEntryPoint() const { return AnalysisEntryPoint; } diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h index f20b0031c1528..1a296a7a190f6 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h @@ -58,25 +58,36 @@ class CheckerContext { AnalysisManager &getAnalysisManager() { return Eng.getAnalysisManager(); } + const AnalysisManager &getAnalysisManager() const { + return Eng.getAnalysisManager(); + } ConstraintManager &getConstraintManager() { return Eng.getConstraintManager(); } + const ConstraintManager &getConstraintManager() const { + return Eng.getConstraintManager(); + } StoreManager &getStoreManager() { return Eng.getStoreManager(); } + const StoreManager &getStoreManager() const { + return Eng.getStoreManager(); + } /// Returns the previous node in the exploded graph, which includes /// the state of the program before the checker ran. Note, checkers should /// not retain the node in their state since the nodes might get invalidated. ExplodedNode *getPredecessor() { return Pred; } + const ExplodedNode *getPredecessor() const { return Pred; } const ProgramPoint getLocation() const { return Location; } const ProgramStateRef &getState() const { return Pred->getState(); } /// Check if the checker changed the state of the execution; ex: added /// a new transition or a bug report. bool isDifferent() { return Changed; } + bool isDifferent() const { return Changed; } /// Returns the number of times the current block has been visited /// along the analyzed path. @@ -108,24 +119,40 @@ class CheckerContext { BugReporter &getBugReporter() { return Eng.getBugReporter(); } + const BugReporter &getBugReporter() const { + return Eng.getBugReporter(); + } const SourceManager &getSourceManager() { return getBugReporter().getSourceManager(); } + const SourceManager &getSourceManager() const { + return getBugReporter().getSourceManager(); + } Preprocessor &getPreprocessor() { return getBugReporter().getPreprocessor(); } + const Preprocessor &getPreprocessor() const { return getBugReporter().getPreprocessor(); } SValBuilder &getSValBuilder() { return Eng.getSValBuilder(); } + const SValBuilder &getSValBuilder() const { + return Eng.getSValBuilder(); + } SymbolManager &getSymbolManager() { return getSValBuilder().getSymbolManager(); } + const SymbolManager &getSymbolManager() const { + return getSValBuilder().getSymbolManager(); + } ProgramStateManager &getStateManager() { return Eng.getStateManager(); } + const ProgramStateManager &getStateManager() const { + return Eng.getStateManager(); + } AnalysisDeclContext *getCurrentAnalysisDeclContext() const { return Pred->getLocationContext()->getAnalysisDeclContext(); diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 2335588dbd27c..40d4e6811cb99 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -196,6 +196,7 @@ class ExprEngine { ASTContext &getContext() const { return AMgr.getASTContext(); } AnalysisManager &getAnalysisManager() { return AMgr; } + const AnalysisManager &getAnalysisManager() const { return AMgr; } AnalysisDeclContextManager &getAnalysisDeclContextManager() { return AMgr.getAnalysisDeclContextManager(); @@ -206,8 +207,10 @@ class ExprEngine { } SValBuilder &getSValBuilder() { return svalBuilder; } + const SValBuilder &getSValBuilder() const { return svalBuilder; } BugReporter &getBugReporter() { return BR; } + const BugReporter &getBugReporter() const { return BR; } cross_tu::CrossTranslationUnitContext * getCrossTranslationUnitContext() { @@ -416,12 +419,17 @@ class ExprEngine { unsigned int Space, bool IsDot) const; ProgramStateManager &getStateManager() { return StateMgr; } + const ProgramStateManager &getStateManager() const { return StateMgr; } StoreManager &getStoreManager() { return StateMgr.getStoreManager(); } + const StoreManager &getStoreManager() const { return StateMgr.getStoreManager(); } ConstraintManager &getConstraintManager() { return StateMgr.getConstraintManager(); } + const ConstraintManager &getConstraintManager() const { + return StateMgr.getConstraintManager(); + } // FIXME: Remove when we migrate over to just using SValBuilder. BasicValueFactory &getBasicVals() { @@ -429,6 +437,7 @@ class ExprEngine { } SymbolManager &getSymbolManager() { return SymMgr; } + const SymbolManager &getSymbolManager() const { return SymMgr; } MemRegionManager &getRegionManager() { return MRMgr; } DataTag::Factory &getDataTags() { return Engine.getDataTags(); } diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index 52714535e7907..1fce3da4d3f26 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -572,7 +572,9 @@ class ProgramStateManager { CallEventManager &getCallEventManager() { return *CallEventMgr; } StoreManager &getStoreManager() { return *StoreMgr; } + const StoreManager &getStoreManager() const { return *StoreMgr; } ConstraintManager &getConstraintManager() { return *ConstraintMgr; } + const ConstraintManager &getConstraintManager() const { return *ConstraintMgr; } ExprEngine &getOwningEngine() { return *Eng; } ProgramStateRef 
@llvmbot
Copy link
Member

llvmbot commented Aug 21, 2025

@llvm/pr-subscribers-clang-static-analyzer-1

Author: Arseniy Zaostrovnykh (necto)

Changes

Improve const-correctness of CheckerContext API by defining the missing const overloads to its accessor member functions.

This NFC change is triggered by a work on a downstream checker that operated on a const CheckerConst& C most of the time, but needed C.getPredecessor() at one point, which forced me to remove const from many places.


Full diff: https://github.com/llvm/llvm-project/pull/154741.diff

4 Files Affected:

  • (modified) clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h (+2)
  • (modified) clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h (+27)
  • (modified) clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h (+9)
  • (modified) clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h (+2)
diff --git a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h index 19535e6bac4d5..f6a023368f3d2 100644 --- a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h +++ b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h @@ -623,10 +623,12 @@ class BugReporter { ASTContext &getContext() { return D.getASTContext(); } const SourceManager &getSourceManager() { return D.getSourceManager(); } + const SourceManager &getSourceManager() const { return D.getSourceManager(); } const AnalyzerOptions &getAnalyzerOptions() { return D.getAnalyzerOptions(); } Preprocessor &getPreprocessor() { return D.getPreprocessor(); } + const Preprocessor &getPreprocessor() const { return D.getPreprocessor(); } /// Get the top-level entry point for the issue to be reported. const Decl *getAnalysisEntryPoint() const { return AnalysisEntryPoint; } diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h index f20b0031c1528..1a296a7a190f6 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h @@ -58,25 +58,36 @@ class CheckerContext { AnalysisManager &getAnalysisManager() { return Eng.getAnalysisManager(); } + const AnalysisManager &getAnalysisManager() const { + return Eng.getAnalysisManager(); + } ConstraintManager &getConstraintManager() { return Eng.getConstraintManager(); } + const ConstraintManager &getConstraintManager() const { + return Eng.getConstraintManager(); + } StoreManager &getStoreManager() { return Eng.getStoreManager(); } + const StoreManager &getStoreManager() const { + return Eng.getStoreManager(); + } /// Returns the previous node in the exploded graph, which includes /// the state of the program before the checker ran. Note, checkers should /// not retain the node in their state since the nodes might get invalidated. ExplodedNode *getPredecessor() { return Pred; } + const ExplodedNode *getPredecessor() const { return Pred; } const ProgramPoint getLocation() const { return Location; } const ProgramStateRef &getState() const { return Pred->getState(); } /// Check if the checker changed the state of the execution; ex: added /// a new transition or a bug report. bool isDifferent() { return Changed; } + bool isDifferent() const { return Changed; } /// Returns the number of times the current block has been visited /// along the analyzed path. @@ -108,24 +119,40 @@ class CheckerContext { BugReporter &getBugReporter() { return Eng.getBugReporter(); } + const BugReporter &getBugReporter() const { + return Eng.getBugReporter(); + } const SourceManager &getSourceManager() { return getBugReporter().getSourceManager(); } + const SourceManager &getSourceManager() const { + return getBugReporter().getSourceManager(); + } Preprocessor &getPreprocessor() { return getBugReporter().getPreprocessor(); } + const Preprocessor &getPreprocessor() const { return getBugReporter().getPreprocessor(); } SValBuilder &getSValBuilder() { return Eng.getSValBuilder(); } + const SValBuilder &getSValBuilder() const { + return Eng.getSValBuilder(); + } SymbolManager &getSymbolManager() { return getSValBuilder().getSymbolManager(); } + const SymbolManager &getSymbolManager() const { + return getSValBuilder().getSymbolManager(); + } ProgramStateManager &getStateManager() { return Eng.getStateManager(); } + const ProgramStateManager &getStateManager() const { + return Eng.getStateManager(); + } AnalysisDeclContext *getCurrentAnalysisDeclContext() const { return Pred->getLocationContext()->getAnalysisDeclContext(); diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 2335588dbd27c..40d4e6811cb99 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -196,6 +196,7 @@ class ExprEngine { ASTContext &getContext() const { return AMgr.getASTContext(); } AnalysisManager &getAnalysisManager() { return AMgr; } + const AnalysisManager &getAnalysisManager() const { return AMgr; } AnalysisDeclContextManager &getAnalysisDeclContextManager() { return AMgr.getAnalysisDeclContextManager(); @@ -206,8 +207,10 @@ class ExprEngine { } SValBuilder &getSValBuilder() { return svalBuilder; } + const SValBuilder &getSValBuilder() const { return svalBuilder; } BugReporter &getBugReporter() { return BR; } + const BugReporter &getBugReporter() const { return BR; } cross_tu::CrossTranslationUnitContext * getCrossTranslationUnitContext() { @@ -416,12 +419,17 @@ class ExprEngine { unsigned int Space, bool IsDot) const; ProgramStateManager &getStateManager() { return StateMgr; } + const ProgramStateManager &getStateManager() const { return StateMgr; } StoreManager &getStoreManager() { return StateMgr.getStoreManager(); } + const StoreManager &getStoreManager() const { return StateMgr.getStoreManager(); } ConstraintManager &getConstraintManager() { return StateMgr.getConstraintManager(); } + const ConstraintManager &getConstraintManager() const { + return StateMgr.getConstraintManager(); + } // FIXME: Remove when we migrate over to just using SValBuilder. BasicValueFactory &getBasicVals() { @@ -429,6 +437,7 @@ class ExprEngine { } SymbolManager &getSymbolManager() { return SymMgr; } + const SymbolManager &getSymbolManager() const { return SymMgr; } MemRegionManager &getRegionManager() { return MRMgr; } DataTag::Factory &getDataTags() { return Engine.getDataTags(); } diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index 52714535e7907..1fce3da4d3f26 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -572,7 +572,9 @@ class ProgramStateManager { CallEventManager &getCallEventManager() { return *CallEventMgr; } StoreManager &getStoreManager() { return *StoreMgr; } + const StoreManager &getStoreManager() const { return *StoreMgr; } ConstraintManager &getConstraintManager() { return *ConstraintMgr; } + const ConstraintManager &getConstraintManager() const { return *ConstraintMgr; } ExprEngine &getOwningEngine() { return *Eng; } ProgramStateRef 
@github-actions
Copy link

⚠️ C/C++ code formatter, clang-format found issues in your code. ⚠️

You can test this locally with the following command:
git-clang-format --diff HEAD~1 HEAD --extensions h -- clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h
View the diff from clang-format here.
diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h index 1a296a7a1..cf035a999 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h @@ -72,9 +72,7 @@ public: StoreManager &getStoreManager() { return Eng.getStoreManager(); } - const StoreManager &getStoreManager() const { - return Eng.getStoreManager(); - } + const StoreManager &getStoreManager() const { return Eng.getStoreManager(); } /// Returns the previous node in the exploded graph, which includes /// the state of the program before the checker ran. Note, checkers should @@ -119,9 +117,7 @@ public: BugReporter &getBugReporter() { return Eng.getBugReporter(); } - const BugReporter &getBugReporter() const { - return Eng.getBugReporter(); - } + const BugReporter &getBugReporter() const { return Eng.getBugReporter(); } const SourceManager &getSourceManager() { return getBugReporter().getSourceManager(); @@ -131,14 +127,14 @@ public: } Preprocessor &getPreprocessor() { return getBugReporter().getPreprocessor(); } - const Preprocessor &getPreprocessor() const { return getBugReporter().getPreprocessor(); } + const Preprocessor &getPreprocessor() const { + return getBugReporter().getPreprocessor(); + } SValBuilder &getSValBuilder() { return Eng.getSValBuilder(); } - const SValBuilder &getSValBuilder() const { - return Eng.getSValBuilder(); - } + const SValBuilder &getSValBuilder() const { return Eng.getSValBuilder(); } SymbolManager &getSymbolManager() { return getSValBuilder().getSymbolManager(); diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 40d4e6811..d184986cd 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -422,7 +422,9 @@ public: const ProgramStateManager &getStateManager() const { return StateMgr; } StoreManager &getStoreManager() { return StateMgr.getStoreManager(); } - const StoreManager &getStoreManager() const { return StateMgr.getStoreManager(); } + const StoreManager &getStoreManager() const { + return StateMgr.getStoreManager(); + } ConstraintManager &getConstraintManager() { return StateMgr.getConstraintManager(); diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index 1fce3da4d..12487a33a 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -574,7 +574,9 @@ public: StoreManager &getStoreManager() { return *StoreMgr; } const StoreManager &getStoreManager() const { return *StoreMgr; } ConstraintManager &getConstraintManager() { return *ConstraintMgr; } - const ConstraintManager &getConstraintManager() const { return *ConstraintMgr; } + const ConstraintManager &getConstraintManager() const { + return *ConstraintMgr; + } ExprEngine &getOwningEngine() { return *Eng; } ProgramStateRef 
@necto
Copy link
Contributor Author

necto commented Aug 21, 2025

Unless I see objections, I'll merge this PR tomorrow

@necto necto merged commit f93f6e5 into llvm:main Aug 25, 2025
9 checks passed
@necto necto deleted the az/checker-context-const-correct branch August 25, 2025 07:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:static analyzer clang Clang issues not falling into any other category

3 participants