[clang] [clang][nullability] Propagate storage location / value of `++`/`--` operators. (PR #94217)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 3 06:24:45 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: None (martinboehme)
<details>
<summary>Changes</summary>
To avoid generating unnecessary values, we don't create a new value but instead
leave it to the specific analysis to do this if desired.
---
Full diff: https://github.com/llvm/llvm-project/pull/94217.diff
2 Files Affected:
- (modified) clang/lib/Analysis/FlowSensitive/Transfer.cpp (+14)
- (modified) clang/unittests/Analysis/FlowSensitive/TransferTest.cpp (+36)
``````````diff
diff --git a/clang/lib/Analysis/FlowSensitive/Transfer.cpp b/clang/lib/Analysis/FlowSensitive/Transfer.cpp
index 4214488c98e5d..d161b231c0b6f 100644
--- a/clang/lib/Analysis/FlowSensitive/Transfer.cpp
+++ b/clang/lib/Analysis/FlowSensitive/Transfer.cpp
@@ -382,6 +382,20 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> {
Env.setValue(*S, Env.makeNot(*SubExprVal));
break;
}
+ case UO_PreInc:
+ case UO_PreDec:
+ // Propagate the storage location, but don't create a new value; to
+ // avoid generating unnecessary values, we leave it to the specific
+ // analysis to do this if desired.
+ propagateStorageLocation(*S->getSubExpr(), *S, Env);
+ break;
+ case UO_PostInc:
+ case UO_PostDec:
+ // Propagate the old value, but don't create a new value; to avoid
+ // generating unnecessary values, we leave it to the specific analysis
+ // to do this if desired.
+ propagateValue(*S->getSubExpr(), *S, Env);
+ break;
default:
break;
}
diff --git a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
index 5c0582e872eb0..cdaee9b2c9288 100644
--- a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
@@ -3760,6 +3760,42 @@ TEST(TransferTest, AddrOfReference) {
});
}
+TEST(TransferTest, Preincrement) {
+ std::string Code = R"(
+ void target(int I) {
+ int &IRef = ++I;
+ // [[p]]
+ }
+ )";
+ runDataflow(
+ Code,
+ [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results,
+ ASTContext &ASTCtx) {
+ const Environment &Env = getEnvironmentAtAnnotation(Results, "p");
+
+ EXPECT_EQ(&getLocForDecl(ASTCtx, Env, "IRef"),
+ &getLocForDecl(ASTCtx, Env, "I"));
+ });
+}
+
+TEST(TransferTest, Postincrement) {
+ std::string Code = R"(
+ void target(int I) {
+ int OldVal = I++;
+ // [[p]]
+ }
+ )";
+ runDataflow(
+ Code,
+ [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results,
+ ASTContext &ASTCtx) {
+ const Environment &Env = getEnvironmentAtAnnotation(Results, "p");
+
+ EXPECT_EQ(&getValueForDecl(ASTCtx, Env, "OldVal"),
+ &getValueForDecl(ASTCtx, Env, "I"));
+ });
+}
+
TEST(TransferTest, CannotAnalyzeFunctionTemplate) {
std::string Code = R"(
template <typename T>
``````````
</details>
https://github.com/llvm/llvm-project/pull/94217
More information about the cfe-commits
mailing list