Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is using the address of an uninitialized variable UB? [duplicate]

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.

like image 305
Jabberwocky Avatar asked Oct 21 '25 13:10

Jabberwocky


2 Answers

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 to void. [.....]

like image 195
Sourav Ghosh Avatar answered Oct 23 '25 04:10

Sourav Ghosh


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.

like image 25
alk Avatar answered Oct 23 '25 03:10

alk