From: Veiverys, G. <ged...@in...> - 2011-10-31 13:24:11
|
Hi First, I am not sure if this applies to MingW only, or is a general gcc issue, but I start by posting here. I am using the __builtin_return_address() extension to perform basic stack walk when collecting exception info. In fact, this function is not safe when called with an arbitrary level parameter, so I have developed a safe variant based on how it operates, but rather using ReadMemory() winAPI so that reads of illegal addresses won't do harm. The safety of using __builtin_return_address() with arbitrary level parameter has been discussed several years ago on gcc mailing lists. However, I have encountered a different issue. This function relies on stack frame being present to do its work. This means that an optimized compile will break it's functionality. The very first optimization level -O includes the -fomit-frame-pointer which optimizes-out the stack frame. Using MingW 4.6.1 on win32 I have observed the compiler makes no check for this scenario and still emits identical inlined code for functions with and w/o stack frame. In either case it is blindly relying on 'ebp' pointing to beginning of stack for current function. Thus __builtin_return_address() makes compiler emit invalid code in these specific stack frame optimized-out cases. Compiling with '-O -fno-omit-frame-pointer' resolves the issue. Should there be a warning regarding this when performing compilation with no -O and a definite error message when -fomit-frame-pointer is passed either explicitly or via -O switches? |