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?

Reply via email to