我可以为 gfortran 使用哪些 gcc 编译器选项
what gcc compiler options can I use for gfortran
学习了Option Summary for gfortran
but found no compiler option to detect integer overflow. Then I found the GCC (GNU Compiler Collection) flag option -fsanitize=signed-integer-overflow
here,在调用gfortran
的时候用到了。有效——可以在 运行 时间检测到整数溢出!
那么 -fsanitize=signed-integer-overflow
在这里做什么?只是在 gfortran
生成的机器代码中添加一些检查整数溢出的机器级代码?
GCC (GNU Compiler Collection) flag options and gfortran compiler options有什么关系?我可以为 gfortran, g++
等使用哪些 gcc 编译器选项?
有 GCC - GNU Compiler Collection。它共享通用的后端和中间端,并具有针对不同语言的前端。例如,通常由命令 gcc
、g++
和 gfortran
.
调用的 C、C++ 和 Fortran 的前端
它实际上更复杂,您可以在 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 中实现的多种语言,对于某些明显特定于语言的检查可能有一些例外。特别是您询问的 -fsanitize=signed-integer-overflow
对于 C 和 C++ 来说都非常好。有符号整数覆盖在 C 和 C++ 中是未定义的行为,Fortran 标准不允许这样做(这实际上意味着相同,Fortran 只是使用不同的词)。
这不是您问题的非常精确的答案,但是啊哈!在学习编译器的时候,正在学习 gcc(GNU 编译器 Collection),就像 llvm 一样,是 three-stage compiler.
的一个例子
- “前端”解析您感兴趣的任何一种语言的语法,并吐出一个抽象语法树 (AST),它以与语言无关的方式表示您的程序。
- 然后“中间端”(糟糕的名字,但是“聪明的一点”)将该 AST 重组为另一个 AST,它在语义上是等价的,但更容易转换为机器代码。
- 然后“后端”将重组后的 AST 转换为一个或另一个处理器的汇编程序,可能会在此过程中进行特定于平台的微优化。
这就是为什么(大量的)gcc/llvm 选项对于(显然是疯狂的)不同语言出乎意料地通用。一些选项特定于 C、Fortran、Objective-C 或其他任何选项,但它们中的大多数(可能)与中间位和最后位有关,因此对于所有语言都是通用的gcc/llvm支持。
因此,各种选项特定于第 1、2 或 3 阶段,但可能不方便这样标记;但是,考虑到这一点,您可能会合理地凭直觉判断与您感兴趣的特定语言相关和不相关的内容。
(出于这种原因,我会武断地宣称 CC++FortranJavaPerlPython 本质上是一种单一语言,只有琐碎的句法和库细节来区分方言)。
学习了Option Summary for gfortran
but found no compiler option to detect integer overflow. Then I found the GCC (GNU Compiler Collection) flag option -fsanitize=signed-integer-overflow
here,在调用gfortran
的时候用到了。有效——可以在 运行 时间检测到整数溢出!
那么 -fsanitize=signed-integer-overflow
在这里做什么?只是在 gfortran
生成的机器代码中添加一些检查整数溢出的机器级代码?
GCC (GNU Compiler Collection) flag options and gfortran compiler options有什么关系?我可以为 gfortran, g++
等使用哪些 gcc 编译器选项?
有 GCC - GNU Compiler Collection。它共享通用的后端和中间端,并具有针对不同语言的前端。例如,通常由命令 gcc
、g++
和 gfortran
.
它实际上更复杂,您可以在 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 中实现的多种语言,对于某些明显特定于语言的检查可能有一些例外。特别是您询问的 -fsanitize=signed-integer-overflow
对于 C 和 C++ 来说都非常好。有符号整数覆盖在 C 和 C++ 中是未定义的行为,Fortran 标准不允许这样做(这实际上意味着相同,Fortran 只是使用不同的词)。
这不是您问题的非常精确的答案,但是啊哈!在学习编译器的时候,正在学习 gcc(GNU 编译器 Collection),就像 llvm 一样,是 three-stage compiler.
的一个例子- “前端”解析您感兴趣的任何一种语言的语法,并吐出一个抽象语法树 (AST),它以与语言无关的方式表示您的程序。
- 然后“中间端”(糟糕的名字,但是“聪明的一点”)将该 AST 重组为另一个 AST,它在语义上是等价的,但更容易转换为机器代码。
- 然后“后端”将重组后的 AST 转换为一个或另一个处理器的汇编程序,可能会在此过程中进行特定于平台的微优化。
这就是为什么(大量的)gcc/llvm 选项对于(显然是疯狂的)不同语言出乎意料地通用。一些选项特定于 C、Fortran、Objective-C 或其他任何选项,但它们中的大多数(可能)与中间位和最后位有关,因此对于所有语言都是通用的gcc/llvm支持。
因此,各种选项特定于第 1、2 或 3 阶段,但可能不方便这样标记;但是,考虑到这一点,您可能会合理地凭直觉判断与您感兴趣的特定语言相关和不相关的内容。
(出于这种原因,我会武断地宣称 CC++FortranJavaPerlPython 本质上是一种单一语言,只有琐碎的句法和库细节来区分方言)。