[clang] [clang-tools-extra] [clang-tidy] [misc-const-correctness] fix fake positive when pointer is returned as non const (PR #162067)
Changqing Jing via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 6 03:53:00 PDT 2025
https://github.com/Changqing-JING created https://github.com/llvm/llvm-project/pull/162067
```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;
```
>From 88b5ddbf8e99c207e0f6796a138432a85d8ac443 Mon Sep 17 00:00:00 2001
From: Changqing Jing <changqing.jing at bmw.com>
Date: Mon, 6 Oct 2025 18:47:34 +0800
Subject: [PATCH] [clang-tidy]misc-const-correctness fix fake positive when
pointer is returned as none const
---
.../const-correctness-pointer-as-pointers.cpp | 30 +++++++++++++++++++
clang/lib/Analysis/ExprMutationAnalyzer.cpp | 8 ++++-
2 files changed, 37 insertions(+), 1 deletion(-)
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);
More information about the cfe-commits
mailing list