[clang] [clang-tools-extra] [clang-tidy] [misc-const-correctness] fix fake positive when pointer is returned as non const (PR #162067)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 6 03:53:54 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-analysis
@llvm/pr-subscribers-clang-tidy
Author: Changqing Jing (Changqing-JING)
<details>
<summary>Changes</summary>
```cpp
void* ignore_const_return(){
void* const p = nullptr;
return p;
}
```
misc-const-correctness give fake positive when a pointer is not modified but returned as non-const type
```
test.cpp:7:3: warning: pointee of variable 'p' of type 'void *' can be declared 'const' [misc-const-correctness]
7 | void * p = nullptr;
```
---
Full diff: https://github.com/llvm/llvm-project/pull/162067.diff
2 Files Affected:
- (modified) clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp (+30)
- (modified) clang/lib/Analysis/ExprMutationAnalyzer.cpp (+7-1)
``````````diff
diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
index 2ef47266b02b0..6a4cbfec614aa 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
@@ -48,3 +48,33 @@ void ignore_const_alias() {
p_local0 = &a[1];
}
+void* ignore_const_return(){
+ void* const p = nullptr;
+ return p;
+}
+
+void const* const_return(){
+ void * p = nullptr;
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: pointee of variable 'p' of type 'void *' can be declared 'const'
+ // CHECK-FIXES: void const* p
+ return p;
+}
+
+template<typename T>
+T* ignore_const_return_template(){
+ T* const p = nullptr;
+ return p;
+}
+
+template<typename T>
+T const* const_return_template(){
+ T * p = nullptr;
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: pointee of variable 'p' of type 'int *' can be declared 'const'
+ // CHECK-FIXES: T const* p
+ return p;
+}
+
+void instantiate_return_templates() {
+ ignore_const_return_template<int>();
+ const_return_template<int>();
+}
diff --git a/clang/lib/Analysis/ExprMutationAnalyzer.cpp b/clang/lib/Analysis/ExprMutationAnalyzer.cpp
index 3fcd3481c2d6b..c051212ff1e57 100644
--- a/clang/lib/Analysis/ExprMutationAnalyzer.cpp
+++ b/clang/lib/Analysis/ExprMutationAnalyzer.cpp
@@ -787,10 +787,16 @@ ExprMutationAnalyzer::Analyzer::findPointeeToNonConst(const Expr *Exp) {
// FIXME: false positive if the pointee does not change in lambda
const auto CaptureNoConst = lambdaExpr(hasCaptureInit(Exp));
+ // Return statement in function with non-const pointer return type
+ const auto ReturnAsNonConst = returnStmt(
+ hasDescendant(equalsNode(Exp)),
+ hasAncestor(functionDecl(returns(NonConstPointerOrDependentType))));
+
const auto Matches =
match(stmt(anyOf(forEachDescendant(
stmt(anyOf(AssignToNonConst, PassAsNonConstArg,
- CastToNonConst, CaptureNoConst))
+ CastToNonConst, CaptureNoConst,
+ ReturnAsNonConst))
.bind("stmt")),
forEachDescendant(InitToNonConst))),
Stm, Context);
``````````
</details>
https://github.com/llvm/llvm-project/pull/162067
More information about the cfe-commits
mailing list