https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120781
Bug ID: 120781
Summary: builtin_object_size: affected by later
builtin_dynamic_object_size calls?
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: sjames at gcc dot gnu.org
CC: jakub at gcc dot gnu.org, siddhesh at gcc dot gnu.org
Target Milestone: ---
Modifying the example from
https://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html#index-_005f_005fbuiltin_005fobject_005fsize,
I see inconsistent results with -DDYN:
```
#include <assert.h>
typedef struct V {
char buf1[10];
int b;
char buf2[10];
} V;
void check_sizes(char *p, char *q, struct V* var) {
__builtin_printf("__builtin_object_size (p, 0)=%ld\n",
__builtin_object_size (p, 0));
__builtin_printf("__builtin_object_size (p, 1)=%ld\n",
__builtin_object_size (p, 1));
__builtin_printf("__builtin_object_size (q, 0)=%ld\n",
__builtin_object_size (q, 0));
__builtin_printf("__builtin_object_size (q, 1)=%ld\n",
__builtin_object_size (q, 1));
#ifdef DYN
__builtin_printf("__builtin_dynamic_object_size (p, 0)=%ld\n",
__builtin_dynamic_object_size (p, 0));
__builtin_printf("__builtin_dynamic_object_size (p, 1)=%ld\n",
__builtin_dynamic_object_size (p, 1));
__builtin_printf("__builtin_dynamic_object_size (q, 0)=%ld\n",
__builtin_dynamic_object_size (q, 0));
__builtin_printf("__builtin_dynamic_object_size (q, 1)=%ld\n",
__builtin_dynamic_object_size (q, 1));
#endif
}
int main() {
V var = {};
char *p = &var.buf1[1];
char *q = (char*) &var.b;
check_sizes(p, q, &var);
__builtin_printf("var.buf1=%s, var.b=%d, var.buf2=%s\n", var.buf1,
var.b, var.buf2);
}
```
```
$ gcc b.c -o b -O2 -DDYN && ./b
__builtin_object_size (p, 0)=-1
__builtin_object_size (p, 1)=-1
__builtin_object_size (q, 0)=-1
__builtin_object_size (q, 1)=-1
__builtin_dynamic_object_size (p, 0)=-1
__builtin_dynamic_object_size (p, 1)=-1
__builtin_dynamic_object_size (q, 0)=-1
__builtin_dynamic_object_size (q, 1)=-1
var.buf1=, var.b=0, var.buf2=
$ gcc b.c -o b -O2 && ./b
__builtin_object_size (p, 0)=27
__builtin_object_size (p, 1)=9
__builtin_object_size (q, 0)=16
__builtin_object_size (q, 1)=4
var.buf1=, var.b=0, var.buf2=
```
Is it expected that calls to _bdos somehow affect results of the earlier _bos
call?