[Bug c++/95727] New: Add [[gnu::poison]] attribute

redi at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Jun 17 19:38:36 GMT 2020


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

            Bug ID: 95727
           Summary: Add [[gnu::poison]] attribute
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

GCC supports a pragma for poisoning a variable, but it doesn't respect scope.
It seems useful to be able to poison a variable for the remainder of a scope
(maybe because it's been moved and any further use would be an error), or it's
a pointer that has been invalidated by delete).

This seems to be a good fit for an attribute, because in a program which
doesn't use the variable again after that point it would make no difference
whether the compiler supports the attribute or ignores it.

void f(int*);

void g()
{
  int* p = new int();
  f(p);
  [[poison]] p;
  {
    void* p; // ok, not the same p
  }
  int i = *p;  // error, variable was poisoned
}

It would need to be OK for an implicit destructor to run for poisoned
variables, it should only affect explicit uses of the name in the user code.

I'm not sure if it makes sense to allow poisoning non-local variables in a
given scope ... it could do. Limiting it to local variables (including function
parameters) seems reasonable initially.

A related idea is to mark a variable as read-only from a certain point, so that
it can't be written to, can't have non-const member functions called on it, and
can't have non-const references bound to it.


More information about the Gcc-bugs mailing list