Issue |
151236
|
Summary |
`__builtin_dynamic_object_size` of pointer member marked with `counted_by` confused by extra parens
|
Labels |
new issue
|
Assignees |
|
Reporter |
kees
|
Strangely, `__builtin_dynamic_object_size()` of a pointer member annotated with `counted_by` goes wrong if passed with wrapping parens. As in, the latter reports `SIZE_MAX`.
```
printf("%zu\n", __builtin_dynamic_object_size(fixed->a, 1));
printf("%zu\n", __builtin_dynamic_object_size((fixed->a), 1));
```
This should not be, and doesn't happen for any other similar constructions:
```
#include <stdio.h>
struct fixed_size {
int *a __attribute__((counted_by(a_count)));
short a_count;
};
struct dyn_size {
short b_count;
int b[] __attribute__((counted_by(b_count)));
};
void __attribute__((noinline))
foo(struct fixed_size *fixed, struct dyn_size *dyn)
{
int b;
int *p = &b;
printf("%zu\n", __builtin_dynamic_object_size(p, 1));
printf("%zu\n", __builtin_dynamic_object_size((p), 1));
printf("%zu\n", __builtin_dynamic_object_size(dyn->b, 1));
printf("%zu\n", __builtin_dynamic_object_size((dyn->b), 1));
printf("%zu\n", __builtin_dynamic_object_size(&fixed->a_count, 1));
printf("%zu\n", __builtin_dynamic_object_size((&fixed->a_count), 1));
printf("%zu\n", __builtin_dynamic_object_size(fixed->a, 1));
printf("%zu\n", __builtin_dynamic_object_size((fixed->a), 1));
}
int main(void)
{
struct fixed_size f = { .a_count = 0 };
struct dyn_size d = { .b_count = 0 };
foo(&f, &d);
return 0;
}
```
Prints:
```4
4
0
0
2
2
0
18446744073709551615
```
@bwendling
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs