gfortran可以使用哪些gcc编译器选项

gfortran可以使用哪些gcc编译器选项,c,gcc,fortran,gfortran,compiler-options,C,Gcc,Fortran,Gfortran,Compiler Options,我研究过,但没有发现检测整数溢出的编译器选项。然后我找到了GCC(GNU编译器集合)标志选项-fsanize=signed integer overflow,并在调用gfortran时使用它。它可以工作——可以在运行时检测到整数溢出 那么-fsanize=signed integer overflow在这里做什么呢?只是添加到由gfortran生成的机器代码中检查整数溢出的一些机器级代码 和之间的关系是什么?什么gcc编译器选项可以用于gfortran、g++等?有gcc-。它共享公共后端和中间

我研究过,但没有发现检测整数溢出的编译器选项。然后我找到了GCC(GNU编译器集合)标志选项
-fsanize=signed integer overflow
,并在调用
gfortran
时使用它。它可以工作——可以在运行时检测到整数溢出

那么
-fsanize=signed integer overflow
在这里做什么呢?只是添加到由
gfortran
生成的机器代码中检查整数溢出的一些机器级代码

和之间的关系是什么?什么gcc编译器选项可以用于
gfortran、g++
等?

有gcc-。它共享公共后端和中间端,并具有不同语言的前端。例如,C、C++和FORTRAN前端,这些命令通常由命令<代码> GCC < /代码>、<代码> G++< /COD>和<代码> Gfortran < /C> > 它实际上更复杂,您可以在Fortran源代码上调用
gcc
,在C源代码上调用
gfortran
,除了链接库之外,它的工作原理几乎相同(还有一些其他的优点)。将根据文件扩展名或请求的语言调用相应的前端

您可以查看所有提到的前端的几乎所有GCC(不仅仅是
GCC
)标志。存在特定于语言的某些标志。通常情况下,您会收到如下警告:

gfortran -fcheck=all source.c
cc1: warning: command line option ‘-fcheck=all’ is valid for Fortran but not for C
但是该文件可以很好地编译,该选项被忽略,您将得到一个警告。请注意,它是一个C文件,由
gfortran
命令编译


清理选项不是特定于语言的,并且适用于GCC中实现的多种语言,对于某些明显特定于语言的检查可能有一些例外。特别是 FSANITIZ=符号整数溢出>代码>,这对C和C++都是非常好的。有符号整数OWWROW是C和C++中的未定义行为,FORTRAN标准不允许(这实际上是相同的,FORTRAN只使用不同的单词)。

< P>这不是对您的问题的精确答案,而是AHA!在学习编译器时,我们了解到gcc(GNU编译器集合)和llvm一样,都是一个示例

  • “前端”解析您感兴趣的任何语言的语法,并生成一个抽象语法树(AST),它以独立于语言的方式表示您的程序
  • 然后“中间端”(糟糕的名称,但“聪明的一点”)将该AST重新组织为另一个AST,该AST在语义上是等价的,但更容易转换为机器代码
  • 然后,“后端”将AST重组为一个或另一个处理器的汇编程序,可能在此过程中进行特定于平台的微优化
这就是为什么(大量)gcc/llvm选项对于(显然是非常广泛的)不同语言来说出乎意料地通用。其中一些选项特定于C、Fortran、Objective-C或其他语言,但大多数(可能)都涉及中间位和最后位,因此gcc/llvm支持的所有语言都通用

因此,各种选项特定于阶段1、2或3,但可能无法方便地标记为阶段1、2或3;但是,考虑到这一点,您可以凭直觉合理地判断与您感兴趣的特定语言相关的内容和不相关的内容



(正是出于这种原因,我会武断地宣称CC++FortranJavaPerlPython本质上是一种单一的语言,只有琐碎的语法和库细节来区分方言)。

很抱歉混淆了,
gcc
我真正指的是gcc(问题已经更新)。如果使用了错误的标志选项,编译器将发出警告,这是很好的。然而,对于那些没有抱怨的选项,有些是不起作用的!!!例如,
-fsanize=bounds
-fsanize=integer除以零
都不适用于
gfortran
。因此,我想在调用编译器时,仍然可以使用GCC中的非语言特定的标志选项,比如说
gfortran
,但不应该依赖这些标志选项。只有为特定编译器记录的编译器选项才能保证工作。GFortran手册中提到的选项在GFortran前端中实现,因此特定于Fortran。GCC手册包含特定于C、C++的选项、通用选项以及仅针对特定目标(后端)有效的选项。这些选项中的一些可能对GFortran非常有效,其他的可能不行。感谢您的深入解释!糟糕的是,当调用特定的语言编译器时,
gfortran
例如,使用某些GCC标志选项时,编译器不会发出警告,标志选项也不起作用。