在x86中,GCC在想要呼叫__stack_chk_fail
时生成以下说明:
; start of the basic block
00000757 call sub_590 ; __stack_chk_fail@plt
0000075c add byte [ds:eax], al
0000075e add byte [ds:eax], al
; start point of another function
ARM中发生了类似的行为:
; start of the basic block
00001000 bl __stack_chk_fail@PLT
00001004 dd 0x0000309c ; data entry, NOT executable indeed!
在静态分析工具中,当想要构建CFG时,CFG算法不能确定调用__stack_chk_fails
的基本块的最后一条指令。
在调用__stack_chk_fail
之后使用某种 return 指令以防止CPU执行它不应该执行的指令(或可能的数据条目)是合理的。
在这些情况下,CFG生成器算法假定它是常规函数调用并继续遍历另一个函数的代码(在前一个示例中)或数据条目(在后一个中),这是完全不需要的
所以,我的问题是为什么GCC不会在基本块的结束点插入 return (或 branch )指令?