-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang] Don't emit bogus dangling diagnostics when [[gsl::Owner]]
and [[clang::lifetimebound]]
are used together.
#108280
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: Haojian Wu (hokein) ChangesFixes #108272 Full diff: https://github.com/llvm/llvm-project/pull/108280.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 59ccdf1e15cd81..3a8f159492d2d3 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -300,6 +300,8 @@ Improvements to Clang's diagnostics
- Clang now diagnoses cases where a dangling ``GSLOwner<GSLPointer>`` object is constructed, e.g. ``std::vector<string_view> v = {std::string()};`` (#GH100526).
+- Don't emit bogus dangling diagnostics when ``[[gsl::Owner]]`` and `[[clang::lifetimebound]]` are used together (#GH108272).
+
Improvements to Clang's time-trace
----------------------------------
diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp
index c8e703036c132c..80343905bcaa4d 100644
--- a/clang/lib/Sema/CheckExprLifetime.cpp
+++ b/clang/lib/Sema/CheckExprLifetime.cpp
@@ -289,7 +289,8 @@ static bool isGSLOwner(QualType T) {
static bool shouldTrackImplicitObjectArg(const CXXMethodDecl *Callee) {
if (auto *Conv = dyn_cast_or_null<CXXConversionDecl>(Callee))
- if (isRecordWithAttr<PointerAttr>(Conv->getConversionType()))
+ if (isRecordWithAttr<PointerAttr>(Conv->getConversionType())
+ && Callee->getParent()->hasAttr<OwnerAttr>())
return true;
if (!isInStlNamespace(Callee->getParent()))
return false;
diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
index 234e06f069074b..bc25c33bf9fed5 100644
--- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
+++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
@@ -630,3 +630,37 @@ std::optional<std::string_view> test3(int i) {
}
} // namespace GH100526
+
+namespace GH108272 {
+template <typename T>
+struct [[gsl::Owner]] StatusOr {
+ const T &value() [[clang::lifetimebound]];
+};
+
+template <typename V>
+class Wrapper1 {
+ public:
+ operator V() const;
+ V value;
+};
+std::string_view test1() {
+ StatusOr<Wrapper1<std::string_view>> k;
+ // Be conservative in this case, as there is not enough information available
+ // to infer the lifetime relationship for the Wrapper1 type.
+ std::string_view good = StatusOr<Wrapper1<std::string_view>>().value();
+ return k.value();
+}
+
+template <typename V>
+class Wrapper2 {
+ public:
+ operator V() const [[clang::lifetimebound]];
+ V value;
+};
+std::string_view test2() {
+ StatusOr<Wrapper2<std::string_view>> k;
+ // We expect dangling issues as the conversion operator is lifetimebound。
+ std::string_view bad = StatusOr<Wrapper2<std::string_view>>().value(); // expected-warning {{temporary whose address is used as value of}}
+ return k.value(); // expected-warning {{address of stack memory associated}}
+}
+} // namespace GH108272
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you add some more details to the summary e.g. "The fix adds an additional check in isGSLOwner() for Owner attribute" or something along those lines.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
… and `[[clang::lifetimebound]]` are used together.
0ee0f46
to
05bdd38
Compare
Done. |
In the GSL analysis, we don't track the
this
object if the conversion is not from gsl::owner to gsl pointer, we want to be conservative here to avoid triggering false positives.Fixes #108272