bwendling wrote:

> Perhaps according to the GCC documentation as written. But mode 0 and 1 are 
> in general asking for an upper bound on the accessible bytes (that is, an N 
> so any.access beyond N bytes is definitely out of bounds), so it seems to me 
> that returning -1 is strictly worse than returning 48.

It's the second bit that controls whether it's an upper bound or lower bound 
that's returned, not the least significant bit.

> Do you have a use case for which -1 is a better answer?

I'm sure one could be constructed (for instance, someone wanting to check if 
it's okay to `strcpy` a string of size `48` to a pointer to `failed_devs[argc]` 
in the example above), but that's not really the point.

We're trying to implement a GNU builtin, and the only defined semantics we have 
to go on are GNU's documentation. I can't see how we can deviate from their 
documentation unless it's to say "we can't determine this value" and so return 
`-1` instead of an answer that might be wildly wrong and potentially cause a 
memory leak of some sort. In my made-up example, if we said, "Yes you can write 
up to 48 bytes into `p->failed_devs[argc]`, then a user may overwrite the two 
fields after `field_devs`. If we return `-1`, they'll have to take the "slow", 
but ideally more secure, route.

Lastly, returning `48` in the made-up case is different from the case when an 
immediate is used rather than a variable, which is certainly unexpected. We 
could document that we can't support GNU's implementation exactly, but I don't 
think that's good enough.

>From what I can tell, GNU's idea of what constitutes a "closest surrounding 
>sub-object" is one of a handful of things: the structure containing the field, 
>the array being pointed to with a struct, or the field being pointed into. 
>Example of the last one:

```
struct foo {
    int a;
    int b;
    int c;
};

size_t foo(struct foo *p, int index) {
    return __builtin_dynamic_object_size(&((char *)p->b)[idx], 1); // b is the 
sub-object.
}
```

All of these are explicit in the LLVM IR. Is the worry that they've been 
changed from some transformations? Or are there others I'm missing?

https://github.com/llvm/llvm-project/pull/78526
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to