我学习了Option Summary for gfortran
但发现没有编译器选项来检测整数溢出。然后我找到了 GCC(GNU 编译器集合)标志选项 -fsanitize=signed-integer-overflow
here并在调用 gfortran 时使用它。它有效——可以在运行时检测到整数溢出!
那么-fsanitize=signed-integer-overflow
在这里做什么?只需在 gfortran
生成的机器代码中添加一些检查整数溢出的机器级片段?
GCC (GNU Compiler Collection) flag options之间有什么关系和 gfortran compiler options ?我可以对 gfortran、g++ 等使用哪些 gcc 编译器选项?
最佳答案
有海湾合作委员会 - GNU Compiler Collection 。它共享公共(public)后端和中间端,并具有适用于不同语言的前端。例如,C、C++ 和 Fortran 的前端通常由命令 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 中实现的多种语言,也许对于一些明显特定于语言的检查有一些异常(exception)。特别是您询问的 -fsanitize=signed-integer-overflow
对于 C 和 C++ 来说都可以完美工作。有符号整数溢出是 C 和 C++ 中未定义的行为,并且 Fortran 标准不允许这样做(这实际上意味着相同,Fortran 只是使用不同的单词)。
关于c - 我可以为 gfortran 使用哪些 gcc 编译器选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46080068/