[PATCH] D127434: [clang][dataflow] In `optional` model, match call return via hasType
Sam Estep via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 10 04:37:39 PDT 2022
samestep updated this revision to Diff 435873.
samestep added a comment.
Add a test
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D127434/new/
https://reviews.llvm.org/D127434
Files:
clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp
Index: clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp
===================================================================
--- clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp
+++ clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp
@@ -179,6 +179,11 @@
namespace detail {
+template <class T>
+auto try_add_lvalue_reference(int) -> type_identity<T&>;
+template <class T>
+auto try_add_lvalue_reference(...) -> type_identity<T>;
+
template <class T>
auto try_add_rvalue_reference(int) -> type_identity<T&&>;
template <class T>
@@ -186,6 +191,10 @@
} // namespace detail
+template <class T>
+struct add_lvalue_reference : decltype(detail::try_add_lvalue_reference<T>(0)) {
+};
+
template <class T>
struct add_rvalue_reference : decltype(detail::try_add_rvalue_reference<T>(0)) {
};
@@ -2318,6 +2327,26 @@
UnorderedElementsAre(Pair("merge", "unsafe: input.cc:19:7")));
}
+TEST_P(UncheckedOptionalAccessTest, AssignThroughLvalueReferencePtr) {
+ ExpectLatticeChecksFor(
+ R"(
+ #include "unchecked_optional_access_test.h"
+
+ template <typename T>
+ struct smart_ptr {
+ typename std::add_lvalue_reference<T>::type operator*() &;
+ };
+
+ void target() {
+ smart_ptr<$ns::$optional<float>> x;
+ *x = $ns::nullopt;
+ (*x).value();
+ /*[[check]]*/
+ }
+ )",
+ UnorderedElementsAre(Pair("check", "unsafe: input.cc:12:7")));
+}
+
// FIXME: Add support for:
// - constructors (copy, move)
// - assignment operators (default, copy, move)
Index: clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
===================================================================
--- clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
+++ clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
@@ -165,8 +165,8 @@
}
auto isCallReturningOptional() {
- return callExpr(callee(functionDecl(returns(anyOf(
- optionalOrAliasType(), referenceType(pointee(optionalOrAliasType())))))));
+ return callExpr(hasType(qualType(anyOf(
+ optionalOrAliasType(), referenceType(pointee(optionalOrAliasType()))))));
}
/// Creates a symbolic value for an `optional` value using `HasValueVal` as the
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127434.435873.patch
Type: text/x-patch
Size: 2298 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220610/44f79e5f/attachment-0001.bin>
More information about the cfe-commits
mailing list