有人可以指出两者之间的区别吗gcc -D_FORTIFY_SOURCE=1
and -D_FORTIFY_SOURCE=2
?我猜=2
更安全吗?我无法找到逐点列出差异的列表。
我也读过-D_FORTIFY_SOURCE=2
应该与使用-O2
,否则并非所有功能都可用。另外,在这里我还没有找到详细指定回归的列表。我特别有兴趣编译-Os
因为目标是没有那么多闪存的设备。
欢迎任何有关记录位置的提示!
从功能测试宏的手册页(man 7 feature_test_macros http://man7.org/linux/man-pages/man7/feature_test_macros.7.html)
_FORTIFY_SOURCE
(自 glibc 2.3.4 起)
定义此宏会导致执行一些轻量级检查,以在使用各种字符串和内存操作函数时检测某些缓冲区溢出错误(例如,memcpy
, memset
, stpcpy
, strcpy
, strncpy
, strcat
, strncat
, sprintf
, snprintf
, vsprintf
, vsnprintf
, gets
及其宽字符变体)。对于某些函数,会检查参数一致性;例如,进行检查open
已提供一个mode当指定的标志包括时的参数O_CREAT
。并非所有问题都会被检测到,仅会检测到一些常见情况。
If _FORTIFY_SOURCE
设置为 1,编译器优化级别为 1 (gcc -O1
)及以上,执行不应改变符合程序行为的检查。
With _FORTIFY_SOURCE
设置为 2,会添加更多检查,但某些符合要求的程序可能会失败。
一些检查可以在编译时执行(通过头文件中实现的宏逻辑),并导致编译器警告;其他检查在运行时进行,如果检查失败,则会导致运行时错误。
使用此宏需要编译器支持,可通过gcc
从4.0版本开始。
此外,文章使用 FORTIFY_SOURCE 增强应用程序安全性 https://www.redhat.com/en/blog/enhance-application-security-fortifysource(2014 年 3 月)说:
-
gcc -D_FORTIFY_SOURCE=1
仅在编译时添加检查(某些标头是必需的,因为#include <string.h>
)
-
gcc -D_FORTIFY_SOURCE=2
还添加了运行时检查(检测到缓冲区溢出会终止程序)
本质上,_FORTIFY_SOURCE
level 2 更安全,但是是风险稍高的编译策略;如果您使用它,请确保对编译的代码进行非常强大的回归测试,以证明编译器没有引入任何意外的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)