In C, why does my initialized to 0 int variable get reported as uninitialized by "nm"?

494 views Asked by At

I have the following C code:

   //declared at the beginning of the CAStar.c file:
    int TERRAIN_PASSABLE = 1;
    int TERRAIN_IMPASSABLE = 0;
    int TERRAIN_SOME_WHAT_PASSABLE = 2;

I've noticed that for any of these variables, if they have a non-zero value, they are reported by the "nm" command as type "D" (initialized):

_TERRAIN_PASSABLE          |00000008|   D  |
_TERRAIN_SOME_WHAT_PASSABLE|00000004|   D  |

However, those initialized to 0 are reported as "B" (uninitialized):

_TERRAIN_IMPASSABLE        |00000000|   B  |

Why the difference between "initialized with 0" and "initialized with something else but 0" ?

2

There are 2 answers

3
codewarrior On BEST ANSWER

This is more or less about how BSS works and how it is used. B means that variable will be placed in BSS section (and you are right it is uninitialized data section). D means that the symbol is placed in initialized data section.

Read for example this article to know bit more about how BSS works and what it is used for.

0
Lundin On

Most likely these variables are declared at file scope, giving them static storage duration.

All variables with static storage duration are, for optimization purposes, sorted in two categories by the compiler/linker: initialized to 0 or initialized to something else. Variables initialized to zero are placed in a memory segment usually referred to as .bss, while those who are initialized to another value are placed in .data.

The reason for this is that .bss variables can be initialized much faster if the are allocated in adjacent memory. Basically they would be initialized with a single memset. Also, it will reduce the amount of ROM needed. Releated question with details.

EDIT

The reason .bss variables end up under uninitialized is likely because there is a rule in the C language (C11 6.7.9/10) stating that all static storage duration variables that aren't initialized explicitly by the programmer (they are "uninitialized"), shall be initialized to zero