GCC和Clang的两个优化器相关的编译器开关

GCC和Clang的两个优化器相关的编译器开关,在系统编程中非常有用。

-fno-strict-aliasing

禁止依赖于严格别名规则的优化。严格别名规则指的是两个不相关类型的指针解引用不会相互影响,一个例外是(signed/unsigned) char指针解引用会与任何其它指针解引用互相影响。

-fwrapv

将有符号数溢出定义为2的补码回卷,禁止依赖于有符号数溢出是未定义行为的优化。

这两个开关很多软件都在用,Linux内核在使用-fno-strict-aliasing,很多编程语言和数据库等系统软件也在使用-fwrapv。

遵守严格别名规则的话,只能使用memcpy进行数据重解析,会导致一定的性能问题。有符号数溢出是未定义行为也不利于程序使用分支实现检测溢出等操作。由于这两种特性的应用较为频繁,贸然开启相关优化还会带来一定的安全问题,因为有可能优化掉一些防御性代码分支。

GCC和Clang在-O2、-O3、-Os下面默认会开启相关优化,所以需要使用这两个开关关掉这些优化。

下面的文章介绍了Linus对于这两个特性的口水战:

https://zine.la/article/686f5e1e554a4f439bef689005771519/

https://www.oschina.net/news/96906/linus-was-angry-about-standard-saying?p=1

下面的文章介绍了Clang是如何看待和处理未定义行为的:

https://blog.csdn.net/monkey07118124/article/details/50588336

https://www.cnblogs.com/foohack/p/3582239.html

发布了29 篇原创文章 · 获赞 1 · 访问量 3394

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/103940738