The IBM AIX xlc
compiler offers a flag that generates code to initialise local variable storage:
initauto=<hh>
Initialialize automatic storage to <hh>. <hh> is a
hexadecimal value. This generates extra code and
should only be used for error determination.
I think the MSVC compiler does something similar for debug builds, but my memory may be hazy on this point.
Is there an equivalent option for GCC?
OK, Best answer I can offer.
http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html says "no," by omission. There's no documentation of anything to inject stack-wiping code into the output.
As near as I could guess, the only way this could work, is to inject some memset
-like code (perhaps as simple as a few mov
operations, but nonetheless) into the beginning of each embedded lexical frame in which an automatic variable is created. As near as I can tell -- and I am far from an expert on the internals of GCC, but -- there seems to be nothing documented that would do so.
In further following this, the PDF gccint.pdf of GCC Internals (http://gcc.gnu.org/onlinedocs/gccint.pdf) on page 361 defines that the GCC name for the frame pointer adjustment call step on entry to a function is prologue
. (I don't really know/understand whether this applies to other lexical scopes within a function, however.) Since that should occur in a Machine Definition (md) file, any such option would seem to have to be defined for a CPU architecture. I poked at their online ViewCVS at http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/ and found (at least one) copy of prologue
around line 11,893 of i386.md, which after playing search-for-the-function-expansion a few hops, doesn't seem to have anything to emit conditional code like that.
But this under-GCC's-hood stuff is kinda neat...
I cannot find any definitive reference, but it seems that certain copies of GCC (particularly the GCC Fortran compiler) have a -finit-local-zero
option to automatically set any non-explicitly initialized local variables or arrays to zero.
As far standard GCC goes, the only feature on this topic that I could find is -Wuninitialized
to throw warnings on any uninitialized variables (though I know this isn't what you're looking for).
How badly do you need this? If you have a really good reason, I suppose it can't be that hard to copy the -finit-local-zero
code to your version of GCC...
C99: If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.
There has been a topic about this question. What happens to a declared, uninitialized variable in C? Does it have a value?.