gcc -fwrapv 参数的含义

该问题参考stackoverflow

该参数含义为:代码中存在溢出并已经考虑,编译器不要对可能溢出的情况进行优化。

例如这段代码,我们可能由于编写失误,认为该函数将永远返回 1。在不带 fwrapv 的情况下,编译器将为我们默认规避掉这种失误,将代码优化为直接返回 1.

而带 fwrapv 的情况下,明确告知编译器我们已经考虑了该情况,请不要进行该优化。则编译器将始终进行 i+1 和 i 的比较。

int gt(int i )
{
    return i+1>i;
}

在 loongarch64 平台上进行验证。可以看到,在不带 fwrapv 的情况下,汇编器直接将 1 作为返回值。
而在携带 fwrapv 的情况下,汇编器始终将 i+1 和 i 进行比较,然后将结果返回。

merore@merore-pc:~/wk/test$ gcc -S -Os a.c -o nowrapv.s
merore@merore-pc:~/wk/test$ cat nowrapv.s 
gt:
    addi.w  $r4,$r0,1           # 0x1
    jr  $r1

merore@merore-pc:~/wk/test$ gcc -S -fwrapv -Os a.c -o wrapv.s
merore@merore-pc:~/wk/test$ cat wrapv.s 
gt:
    addi.w  $r12,$r4,1
    slt $r4,$r4,$r12
    jr  $r1
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 编译的主要任务是将源代码文件作为输入,最终输出目标文件,这期间发生了什么?便是我们本篇文章要介绍的。在开始之...
    QiShare阅读 4,502评论 0 7
  • 前言 编译的主要任务是将源代码文件作为输入,最终输出目标文件,这期间发生了什么?便是我们本篇文章要介绍的。在开始之...
    沐灵洛阅读 3,282评论 0 2
  • 原文作者 Sandeep.S英文原文 [https://www.ibiblio.org/gferg/ldp/GCC...
    JeffreyLi阅读 40,324评论 8 41
  • 原文: GCC-Inline-Assembly-HOWTO 1. 简介(Introduction.) 1.1 Co...
    桂糊涂阅读 4,567评论 1 5
  • gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步...
    MachinePlay阅读 5,754评论 0 1