Is this small code UB?
void Test()
{
int bar;
printf("%p", &bar);
}
IMO it's not UB, but I'd like some other opinions.
It simply prints the address of bar, even if bar has never been initialized.
TL:DR No, your code does not invoke UB by using anything uninitialized, as you might have thought.
The address of a(ny) variable (automatic, in this case) has a defined value, so irrespective of whether the variable itself is initialized or not, the address of the variable is a defined value. You can make use of that value. ( if you're not dealing with pointers and doing double-dereference. :) )
That said, strictly speaking, you should write
printf("%p", (void *)&bar);
as %p expects an argument of type pointer to void and printf() being a variadic function, no promotion (conversion) is performed. Otherwise, this is a well-defined behavior.
C11, chapter §7.21.6.1
pThe argument shall be a pointer tovoid. [.....]
Is this small code UB?
Yes, it's UB because the conversion specifier p requires a void-pointer.
On the other hand the code below does not invoke UB
void Test(void)
{
int bar;
printf("%p", (void*) &bar);
}
as the address of bar is well defined independently whether bar itself got initialised.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With