On 6/19/19 7:04 AM, Florian Rommel wrote:
> Hi,
> 
> Recently I wanted to take and print the address of a label.  When
> compiling with -O2, I noticed that the address equals the function body
> start address if the label is not used as a goto target.
> 
> Here is an example:
> 
> #include <stdio.h>
> int main(void) {
>     printf("main:   %p\n", main);
>     printf("label1: %p\n", &&label1);
>     label1:
>     puts("---");
>     return 0;
> }
> 
> compile with:
> $ gcc -O2 -o example1 example1.c
> 
> or more specifically:
> $ gcc -O1 -fschedule-insns2 -o example1 example1.c
> 
> Output:
>   main:   0x562ed396216e
>   label1: 0x562ed396216e
>   ---
> 
> 
> (or compile with -S to see that the label is moved to the start of the
> function)
> 
> That is not completely surprising because labels as values are not
> really valid outside of the originating function [1].
> 
> However when I assign the two addresses to automatic variables (which
> should be okay) and compare them, they are different (despite having
> the same value; the substraction result is 0).  Passing them to an
> external function yields equality again (if the function is not
> inlined).
> 
> #include <stdio.h>
> void compare(size_t x, size_t y) {
>     printf("x == y : %d\n", x == y);
> }
> int main(void) {
>     size_t m = (size_t)main;
>     size_t l = (size_t)&&label1;
>     printf("m: %p\n", m);
>     printf("l: %p\n", l);
>     printf("m == l : %d\n", m == l);
>     printf("m - l  :% d\n", m - l);
>     compare(m, l);
>     label1:
>     puts("---");
>     return 0;
> }
> 
> Output:
>   m: 0x559a775cd16e
>   l: 0x559a775cd16e
>   m - l  : 0
>   m == l : 0
>   x == y : 1
>   ---
> 
> 
> The reasons for this behavior probably lies in constant
> folding/propagation.
> 
> I'm not sure whether this is technically a bug (Labels as Values /
> Computed Gotos are not Standard C anyway).  But this is at least
> confusing.  Maybe the label should not be moved in the first place?
A label used as a value, but which is not a jump target will have an
indeterminate value -- it'll end up somewhere in its containing
function,  that's all we guarantee in that case.

jeff

Reply via email to