gcc fortify

gcc fortify编译选项是用于在编译时检查缓冲区溢出的等级,它需要gcc版本至少为4.0。您可以使用-D FORTIFY_SOURCE=2来开启fortify检测,并且需要配合-O选项来指定优化等级2。一个简单的测试代码如下:

#include 
#include 

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以上才生效。

你可能感兴趣的:(我的博客,gcc)