跳转到内容

GNU C 编译器内部/GCC 黑客

来自维基教科书,开放世界中的开放书籍

像 C++ 中那样进行函数重载

[编辑 | 编辑源代码]

此示例以前曾介绍过。

像 Java 中那样为每个结构提供 toString() 方法

[编辑 | 编辑源代码]

像 Ruby 中那样从函数中调用代码块

[编辑 | 编辑源代码]

Linux 中的列表实现允许在列表的每个元素上调用代码块。

pagelist.c:

       list_for_each_prev(pos, head) {
                struct nfs_page *p = nfs_list_entry(pos);
                if (page_index(p->wb_page) < pg_idx)
                        break;
       }

list_for_each_prev 将括号中的代码作为参数。技巧是使用一个宏,该宏展开成一个 for() 循环,其循环体成为括号中的代码。该项目的目的是允许程序员在函数调用中使用代码块。

当返回结构时,解除引用函数结果

[编辑 | 编辑源代码]

C 允许解除引用函数的返回值,如果它是指向结构的指针。

 get_struct()->field=0;

如果函数返回结构本身,而不是指向它的指针,则会生成编译时错误。

 get_struct().field=0;
 > request for member `field' in something not a structure or union

此扩展解决了解除引用作为返回值的结构的问题。

使用函数初始化变量

[编辑 | 编辑源代码]

当定义并初始化变量时,初始化器是常量。如果尝试使用函数,无论该函数是什么,都会出现错误。

 int getint() { return 1; }
 int i=getint();
 > initializer element is not constant

当使用变量时,会调用它使用初始化的函数。

像 C++ 中那样设置函数参数的默认值

[编辑 | 编辑源代码]
 void func(int a=0) {
   printf("a=%d\n", a);
 }
 int main() {
   func();
 }
 > syntax error before '=' token

像 C++ 中那样使用引用参数

[编辑 | 编辑源代码]
 void test(int &a, int &b);
 int x,y;
 test(x,y);

返回地址保护 (RAD)

[编辑 | 编辑源代码]

Rad

修复控制劫持攻击 (DIRA)

[编辑 | 编辑源代码]

Dira

使用分段硬件进行数组边界检查 (CASH)

[编辑 | 编辑源代码]

Cash

检测整数溢出 (DIVINE)

[编辑 | 编辑源代码]

Divine

在用户空间开发,在内核中安装 (DUSK)

[编辑 | 编辑源代码]

Dusk

动态信息流跟踪 (GDIF)

[编辑 | 编辑源代码]

Gdif

目标文件中的 GCC 开关

[编辑 | 编辑源代码]

目标文件中的 GCC 开关

-fstack-protector 功能

[编辑 | 编辑源代码]

GCC 4.1 实现了一种针对缓冲区溢出攻击的保护机制,并通过 -fstack-protector 选项将其公开给程序员。这是一个模块化实现受益的功能示例,因为它与编译器的核心功能无关。GCC 是否有足够的钩子来实现 -fstack-protector 模块?

上一个: C 中的函数重载 GCC 黑客 下一个: 链接
华夏公益教科书