gcc fortify编译选项是用于在编译时检查缓冲区溢出的等级,它需要gcc版本至少为4.0。您可以使用-D FORTIFY_SOURCE=2来开启fortify检测,并且需要配合-O选项来指定优化等级2。一个简单的测试代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char buf[10];
strcpy(buf, "This is a long string");
printf("%s\n", buf);
return 0;
}
如果使用gcc -O2 -D_FORTIFY_SOURCE=2 test.c来编译,会得到如下警告:
test.c: In function ‘main’:
test.c:7:5: warning: ‘__builtin_memcpy’ writing 19 bytes into a region of size 10 overflows the destination [-Wstringop-overflow=]
7 | strcpy(buf, "This is a long string");
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果运行编译后的程序,会得到如下错误:
*** buffer overflow detected ***: terminated
Aborted (core dumped)
这说明fortify检测成功发现了缓冲区溢出的问题。
注意:
- 3 在2的基础上,可以对malloc出来的内存进行检测 (gcc 需要大于12)
- 2 在1的基础上,可以对栈变量进行检测
- 1 在编译时进行检测
- 优化等级必须要大于O2这个选项才会生效。level 3需要gcc 12以上才生效。
`__builtin_object_size`和`__builtin_dynamic_object_size`是GCC编译器提供的内建函数,用于在编译时或运行时确定对象的大小。
`__builtin_object_size`函数接受一个指针作为参数,返回一个编译时常量,该常量是指针可能指向的对象的最大或最小对象大小估计。这个函数主要依赖于编译器的优化功能,例如在函数边界上确定对象大小或通过非平凡的控制流跟踪指针赋值。
`__builtin_dynamic_object_size`函数与`__builtin_object_size`类似,也是返回从指针到指针指向的对象的末尾的字节数,但返回的大小可能不是常量。这使得在更广泛的使用场景中成功评估对象大小估计,并且可能比`__builtin_object_size`更精确,但它可能会带来性能损失,因为它可能会增加运行时的大小计算开销。文章来源:https://www.toymoban.com/news/detail-624656.html
至于Clang编译器,据我所知,Clang在15.0.0版本中支持`-fstrict-flex-arrays=<arg>`选项,该选项可以控制哪些数组边界导致灵活的数组成员。该选项在大多数情况下都可以得到更准确的`__builtin_object_size`和`__builtin_dynamic_object_size`结果。此外,Clang的UndefinedBehaviorSanitizer(UBSan)也提供了一些对未定义行为的检查,这可能与`__builtin_object_size`和`__builtin_dynamic_object_size`的功能有所重叠。总的来说,Clang应该可以使用这两个内建函数,但可能需要检查你的Clang版本以确保兼容性。文章来源地址https://www.toymoban.com/news/detail-624656.html
到了这里,关于gcc fortify的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!