-stack_protector/-stack_protector_all [Professional Edition only] [V2.04.00 or later] |
< Compile Options / Object Options >
This option generates a code for detection of stack smashing at the entry and the end of a function. A code for detection of stack smashing consists of instructions executing the three processes shown below. |
(1) A 4-byte area is allocated just before (in the direction towards address 0xFFFFFFFF) the local variable area at the entry to a function, and the value specified by <number> is stored in the allocated area.
(2) At the end of the function, whether the 4-byte area in which <number> was stored has been rewritten is checked.
(3) If the 4-byte area has been rewritten in (2), the __stack_chk_fail function is called as the stack has been smashed.
A decimal number from 0 to 4294967295 should be specified in <number>. If the specification of <number> is omitted, the compiler automatically select the number. |
The __stack_chk_fail function needs to be defined by the user. It should contain postprocesses for the detected stack smashing. |
The __stack_chk_fail function is not subject to generating a code for detection of stack smashing due to the -stack_protector and -stack_protector_all options and #pragma stack_protector. |
In a C++ program, add extern "C" to the definition or the declaration for __stack_chk_fail function. |
Prevent returning to the caller (the function where stack smashing was detected) by taking measures such as calling abort() in __stack_chk_fail function and terminating the program. |
If -stack_protector is specified, this option generates a code for detection of stack smashing for only functions having a structure, union, or array that exceeds eight bytes as a local variable. If -stack_protector_all is specified, this option generates a code for detection of stack smashing for all functions. |
If these options are used simultaneously with #pragma stack_protector, the specification by #pragma stack_protector becomes valid. |
Even though these options are specified, a code for detection of stack smashing is not generated for a functions for which one of the following #pragma directives is specified. |
#pragma inline, #pragma inline_asm, #pragma entry, #pragma no_stack_protector
When compilation is performed with -stack_protector=0 specified