C 语言一直以来都以追求极致的性能和灵活性而著称,然而,在 C 语言中使用不当的指针访问和内存越界等常见问题却经常导致程序崩溃和安全漏洞。随着 C 语言的广泛应用,这种风险越来越不可忽视。

为了解决这个问题,Clang 提供了一种新的编译选项,-fbounds-safety,它可以在编译时强制实施边界安全性,确保指针访问和数组访问在边界内,从而有效地避免内存泄漏和缓冲区溢出等问题。

为了更好地了解这个选项,我们来看一下这个 RFC 的一些要点。

选项和支持

Clang 提供了两个选项来控制边界安全检查:

-fbounds-checking:这个选项只检查指针访问,不检查数组访问。此外,它还会将越界引用视为错误,从而影响程序执行效率。

-fbounds-safety:这个选项可以检查指针访问和数组访问。此外,它还会针对越界问题进行静态分析,找出潜在的内存泄漏和缓冲区溢出等问题,从而避免类似 Heartbleed 漏洞的发生。但这个选项可能会导致更长的编译时间和更高的代码大小。

Clang 的前端已经支持了这两个选项,但目前只有 C 和 C++ 语言是支持的。

用法和限制

要启用边界安全检查,只需在编译命令中加入 -fbounds-safety 选项即可。例如:

clang -fbounds-safety test.c -o test

需要注意的是,这个选项需要 Clang 3.9 或更高版本的支持,并且有一些限制:

只有明确指定长度的数组才会进行边界检查。

对于动态分配的内存,边界检查只能在运行时进行,无法在编译时进行。

对于已经使用的代码,需要进行逐步的修改和测试,以确保其向后兼容性。

未来发展

尽管边界安全性是一个重要的问题,但这个选项还处于实验阶段,仍需要进一步测试和验证。随着技术的发展和需求的增加,这个功能也会不断完善和改进。

因此,如果您也关心 C 语言的安全性和可靠性,欢迎试用这个选项并参与 Clang 的开发和测试工作,共同推动 C 语言的发展和进步!

详情参考

了解更多有趣的事情:https://blog.ds3783.com/