https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109548

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2023-04-19
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
We could special-case std::basic_string::c_str() here but maybe it would be
better to add an attribute for describing the lifetime of pointers/references
returned from member functions.

We could annotate string::c_str() and string::data() and string::begin() etc.
to indicate that they share the lifetime of *this:

    [[gnu::lifetime(this)]]
    const charT*
    basic_string<charT, traits, Alloc>::c_str() const noexcept;

And maybe annotate member functions of view-like types to say that they _don't_
share the lifetime of *this:

    [[gnu::lifetime(!this)]]
    T*
    span<T, E>::data() const noexcept;

(!this) is not visually distinct from (this) though, so a different syntax
would be better. Maybe lifetime(nullptr) or lifetime(0)?

It might not be possible to use lifetime(this) annotations for non-trivial
analysis, because of cases like this:

    std::string s = "abc";
    auto p = s.c_str();  // OK
    s.clear();           // p now dangles
    *p;                  // ERR

Without creating a DSL for describing iterator invalidation of members like
string::clear() and string::insert() we can probably only use such an attribute
to allow the front-end to diagnose the simplest cases like foo().c_str() in
comment 0.

Reply via email to