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.
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
p
The 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.
This behavior is well defined.
The address of the variable is known. The fact that it hasn't been explicitly initialized doesn't matter.