bwendling wrote:
> ```
> #include <stdio.h>
> #include <stdlib.h>
> struct flex {
> int c;
> int fam[] __attribute__((counted_by(c)));
> };
>
> int main() {
> struct flex *p = (struct flex *)malloc(sizeof(struct flex) + sizeof(int)
> * 10);
> p->c = 100;
> printf("%lu\n", __builtin_dynamic_object_size(&p->fam[0], 0)); // 40 :
> size from malloc, but it only contains the array part. Shouldn't it be 44 to
> include the entire object size?
> printf("%lu\n", __builtin_dynamic_object_size(&p->fam[0], 1)); // 40 :
> size from malloc;
> printf("%lu\n", __builtin_dynamic_object_size(p, 0)); // 404 :
> size from counted_by
> }
> ```
>
> @bwendling It could be tracked as a separate issue, but there seems to be
> some inconsistencies in where bdos is derived from. For `p` it seems the
> counted_by wins over malloc. But for `&->fam[0]` malloc seems to win.
>
> https://godbolt.org/z/G7WfY4faE
I think the first two `printf` s in your code seem correct with 40, because
they're both looking at only the FAM, not the entire struct. The fact that
they're not reporting 400 here is because godbolt doesn't have this PR. With
this PR I get:
```
$ clang -O2 ~/llvm/bdos.c
$ ./a.out
400
400
404
```
Which seems correct to me, given the incorrect value in `p->c`. The
documentation does make it very clear that the user is responsible for
supplying the correct value to the FAM counter. The GCC people are making that
language even stricter, so I'll do that as well. (They also have a dependency
issue between the FAM and the counter field that they're solving with a
compiler-only pseudo-function call. I'll create an intrinsic on our side to do
the same once they land on a solution.)
https://github.com/llvm/llvm-project/pull/70606
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits