aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra
diff options
context:
space:
mode:
authorCongcong Cai <congcongcai0907@163.com>2024-03-07 09:39:29 +0800
committerGitHub <noreply@github.com>2024-03-07 09:39:29 +0800
commit84842f4b3ba175d744c03d40baa8e371522615e8 (patch)
tree8e24ed8d10a05dbc4318a5b2b2bc192fad156fd7 /clang-tools-extra
parent59a92019fbc0a67ec82a903a4f6167ad45545a7f (diff)
downloadllvm-84842f4b3ba175d744c03d40baa8e371522615e8.zip
llvm-84842f4b3ba175d744c03d40baa8e371522615e8.tar.gz
llvm-84842f4b3ba175d744c03d40baa8e371522615e8.tar.bz2
[clang-tidy] bugprone-assert-side-effect can detect side effect from non-const reference parameters (#84095)
Fixes: #84092
Diffstat (limited to 'clang-tools-extra')
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp20
-rw-r--r--clang-tools-extra/docs/ReleaseNotes.rst4
-rw-r--r--clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp24
3 files changed, 43 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
index 43bedd4..c650aae 100644
--- a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
@@ -60,16 +60,26 @@ AST_MATCHER_P2(Expr, hasSideEffect, bool, CheckFunctionCalls,
}
if (const auto *CExpr = dyn_cast<CallExpr>(E)) {
- bool Result = CheckFunctionCalls;
+ if (!CheckFunctionCalls)
+ return false;
if (const auto *FuncDecl = CExpr->getDirectCallee()) {
if (FuncDecl->getDeclName().isIdentifier() &&
IgnoredFunctionsMatcher.matches(*FuncDecl, Finder,
Builder)) // exceptions come here
- Result = false;
- else if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FuncDecl))
- Result &= !MethodDecl->isConst();
+ return false;
+ for (size_t I = 0; I < FuncDecl->getNumParams(); I++) {
+ const ParmVarDecl *P = FuncDecl->getParamDecl(I);
+ const Expr *ArgExpr =
+ I < CExpr->getNumArgs() ? CExpr->getArg(I) : nullptr;
+ const QualType PT = P->getType().getCanonicalType();
+ if (ArgExpr && !ArgExpr->isXValue() && PT->isReferenceType() &&
+ !PT.getNonReferenceType().isConstQualified())
+ return true;
+ }
+ if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FuncDecl))
+ return !MethodDecl->isConst();
}
- return Result;
+ return true;
}
return isa<CXXNewExpr>(E) || isa<CXXDeleteExpr>(E) || isa<CXXThrowExpr>(E);
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 1b839a3..d98c4ff 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -128,6 +128,10 @@ New check aliases
Changes in existing checks
^^^^^^^^^^^^^^^^^^^^^^^^^^
+- Improved :doc:`bugprone-assert-side-effect
+ <clang-tidy/checks/bugprone/assert-side-effect>` check by detecting side
+ effect from calling a method with non-const reference parameters.
+
- Improved :doc:`bugprone-non-zero-enum-to-bool-conversion
<clang-tidy/checks/bugprone/non-zero-enum-to-bool-conversion>` check by
eliminating false positives resulting from direct usage of bitwise operators
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp
index c11638a..5cdc1af 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp
@@ -108,3 +108,27 @@ int main() {
return 0;
}
+
+namespace parameter_anaylysis {
+
+struct S {
+ bool value(int) const;
+ bool leftValueRef(int &) const;
+ bool constRef(int const &) const;
+ bool rightValueRef(int &&) const;
+};
+
+void foo() {
+ S s{};
+ int i = 0;
+ assert(s.value(0));
+ assert(s.value(i));
+ assert(s.leftValueRef(i));
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: side effect in assert() condition discarded in release builds
+ assert(s.constRef(0));
+ assert(s.constRef(i));
+ assert(s.rightValueRef(0));
+ assert(s.rightValueRef(static_cast<int &&>(i)));
+}
+
+} // namespace parameter_anaylysis