gcc -D_FORTIFY_SOURCE=1 和 -D_FORTIFY_SOURCE=2 之间的区别

2024-01-07

有人可以指出两者之间的区别吗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_SOURCElevel 2 更安全,但是是风险稍高的编译策略;如果您使用它,请确保对编译的代码进行非常强大的回归测试,以证明编译器没有引入任何意外的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc -D_FORTIFY_SOURCE=1 和 -D_FORTIFY_SOURCE=2 之间的区别 的相关文章

随机推荐