[clang] 9c49b18 - [clang] Fix false positive regression for lifetime analysis warning. (#127460)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 17 05:40:36 PST 2025
Author: Haojian Wu
Date: 2025-02-17T14:40:31+01:00
New Revision: 9c49b188b8e1434eb774ee8422124ad3e8870dce
URL: https://github.com/llvm/llvm-project/commit/9c49b188b8e1434eb774ee8422124ad3e8870dce
DIFF: https://github.com/llvm/llvm-project/commit/9c49b188b8e1434eb774ee8422124ad3e8870dce.diff
LOG: [clang] Fix false positive regression for lifetime analysis warning. (#127460)
This fixes a false positive caused by #114044.
For `GSLPointer*` types, it's less clear whether the lifetime issue is
about the GSLPointer object itself or the owner it points to. To avoid
false positives, we take a conservative approach in our heuristic.
Fixes #127195
(This will be backported to release 20).
Added:
Modified:
clang/lib/Sema/CheckExprLifetime.cpp
clang/test/Sema/Inputs/lifetime-analysis.h
clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp
index 8963cad86dbca..1f87001f35b57 100644
--- a/clang/lib/Sema/CheckExprLifetime.cpp
+++ b/clang/lib/Sema/CheckExprLifetime.cpp
@@ -1239,11 +1239,12 @@ static AnalysisResult analyzePathForGSLPointer(const IndirectLocalPath &Path,
}
// Check the return type, e.g.
// const GSLOwner& func(const Foo& foo [[clang::lifetimebound]])
+ // GSLOwner* func(cosnt Foo& foo [[clang::lifetimebound]])
// GSLPointer func(const Foo& foo [[clang::lifetimebound]])
if (FD &&
- ((FD->getReturnType()->isReferenceType() &&
+ ((FD->getReturnType()->isPointerOrReferenceType() &&
isRecordWithAttr<OwnerAttr>(FD->getReturnType()->getPointeeType())) ||
- isPointerLikeType(FD->getReturnType())))
+ isGLSPointerType(FD->getReturnType())))
return Report;
return Abandon;
diff --git a/clang/test/Sema/Inputs/lifetime-analysis.h b/clang/test/Sema/Inputs/lifetime-analysis.h
index d318033ff0cc4..2072e4603cead 100644
--- a/clang/test/Sema/Inputs/lifetime-analysis.h
+++ b/clang/test/Sema/Inputs/lifetime-analysis.h
@@ -61,6 +61,7 @@ struct basic_string_view {
basic_string_view();
basic_string_view(const T *);
const T *begin() const;
+ const T *data() const;
};
using string_view = basic_string_view<char>;
@@ -80,6 +81,7 @@ struct basic_string {
const T *c_str() const;
operator basic_string_view<T> () const;
using const_iterator = iter<T>;
+ const T *data() const;
};
using string = basic_string<char>;
diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
index 04bb1330ded4c..66a2a19ceb321 100644
--- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
+++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
@@ -852,3 +852,27 @@ struct Test {
};
} // namespace GH120543
+
+namespace GH127195 {
+template <typename T>
+struct StatusOr {
+ T* operator->() [[clang::lifetimebound]];
+ T* value() [[clang::lifetimebound]];
+};
+
+const char* foo() {
+ StatusOr<std::string> s;
+ return s->data(); // expected-warning {{address of stack memory associated with local variable}}
+
+ StatusOr<std::string_view> s2;
+ return s2->data();
+
+ StatusOr<StatusOr<std::string_view>> s3;
+ return s3.value()->value()->data();
+
+ // FIXME: nested cases are not supported now.
+ StatusOr<StatusOr<std::string>> s4;
+ return s4.value()->value()->data();
+}
+
+} // namespace GH127195
More information about the cfe-commits
mailing list