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

Kees Cook <kees at outflux dot net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|INVALID                     |---

--- Comment #9 from Kees Cook <kees at outflux dot net> ---
(In reply to Andrew Pinski from comment #6)
> `&p->array[3];` is well defined in C/C++.
> Having fsanitizer=bounds erroring out for it will break 99% C++ code and a
> few C code.
> 
> That is because you could have a loop which does:
> ```
> int *start = &p->array[0];
> const int *end = &p->array[size];
> 
> for (; start != end; start++)
> {
>   g(*start);
> }
> ```
> 
> And that is well defined C code; and it is how most C++ code iterators are
> done.

Hmm, yeah. That is weird, and I can see why the exception was made if that's
all over the place. But why was it not implemented this way? No dependency on
array address, same loop structure:


```
int *start = &p->array[0];
const int *end = start + size;

for (; start != end; start++)
{
  g(*start);
}
```

How about we just fix this for -fsanitize=bounds-strict?

Also, can we please stop marking this "resolved"? This is an ambiguous bounds
checking situation that leaves a gap in memory safety coverage that I'd like to
find a way to fix. Saying "that's how the spec is written" is good information
and I appreciate the help in understanding why things were intentionally made
ambiguous, but I still need to get this fixed in some way. :)

If not -fsanitize=bounds-strict perhaps some other new flag that would be
C-only?

Reply via email to