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?