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

Reply via email to