Another point is that uninitialized variables can result in a vulnerability. So it is not only bad design and undefined behaviour, it also can make your program exploitable.
Consider this code:
#include <stdio.h>
#include <time.h>
void print_uninitialized(void) {
unsigned var;
printf("%u\n", var);
}
void fake_init() {
unsigned var=42;
}
int main(void) {
print_uninitialized();
fake_init();
print_uninitialized();
}
Possible output:
0
42
The next example is a bit more realistic:
#include <stdio.h>
unsigned uninitialized( void ) {
unsigned var;
return var;
}
unsigned square(unsigned arg){
unsigned result=arg*arg;
return result;
}
int main( void ) {
unsigned to_square;
printf("UNINITIALIZED = %u\n", uninitialized());
while(scanf("%u", &to_square)!=EOF){
printf("%u * %u = %u\n", to_square, to_square, square(to_square));
printf("UNITNITIALIZED = %u\n", uninitialized());
}
}
The uninitialized variable can be modified by a user.
Input:
2
Output:
UNINITIALIZED = 0
2 * 2 = 4
UNITNITIALIZED = 4