我可以将哪些gcc编译器选项用于gfortran

时间:2017-09-06 16:19:29

标签: c gcc fortran gfortran compiler-options

我研究了Option Summary for gfortran,但没有找到编译器选项来检测整数溢出。然后我找到了GCC(GNU编译器集合)标志选项-fsanitize=signed-integer-overflow here并在调用gfortran时使用它。它工作 - 可以在运行时检测整数溢出!

那么-fsanitize=signed-integer-overflow在这做什么?只是添加由gfortran生成的机器级代码来检查整数溢出?

GCC (GNU Compiler Collection) flag optionsgfortran compiler options之间的关系是什么?我可以为gfortran, g++等使用哪些gcc编译器选项?

2 个答案:

答案 0 :(得分:4)

有海湾合作委员会 - GNU Compiler Collection。它共享共同的后端和中端,并具有不同语言的前端。例如,C,C ++和Fortran的前端通常由命令function MiniDropDown (props) { return ( <select name={props.name} value={props.value} onChange={props.handleMiniChange}> { props.list.map((obj) => { return <option key={obj.Value} value={obj.Value}>{obj.Value}</option> }) } </select> ) } /************************************************* * MAIN COMPONENT *************************************************/ export default class DateMenu extends React.Component { constructor(props) { super(props); this.state = { month:'MM', day:'DD', year:'YYYY', } this.handleDateChange = this.handleDateChange.bind(this) this.handleMiniChange = this.handleMiniChange.bind(this) } handleMiniChange(event) { const name = event.target.name; const value = event.target.value; this.setState({ [name]: value}); this.handleDateChange() } handleDateChange () { const _date = `${this.state.month}/${this.state.day}/${this.state.year}`; this.props.common_props.update_field(this.props.name, _date); } render() { const common_props= { form: this.props.common_props.form_data, handleMiniChange: this.handleMiniChange, } return ( <div className='traveler_data_row'> <label> {this.props.specs.label} </label> <MiniDropDown value={this.state.month} name='month' list={getMonths()} {...common_props} /> <MiniDropDown value={this.state.day} name='day' list={getDays()} {...common_props} /> <MiniDropDown value={this.state.year} name='year' list={getYears()} {...common_props} /> </div> ) } } gccg++调用。

实际上它更复杂,您可以在Fortran源上调用gfortran,在C源上调用gcc,它与链接库的例外情况几乎相同(还有其他一些好点)。将根据文件扩展名或请求的语言调用适当的前端。

您可以查看所有前面提到的几乎所有GCC(不仅仅是gfortran)标志。某些标志是特定于语言的。通常你会收到像

这样的警告
gcc

但文件编译正常,该选项只是被忽略,你会得到一个警告。注意它是一个C文件,它由gfortran -fcheck=all source.c cc1: warning: command line option ‘-fcheck=all’ is valid for Fortran but not for C 命令编译就好了。

清理选项是AFAIK,而不是特定于语言的选项,适用于在GCC中实现的多种语言,对于某些明显的语言特定检查可能有一些例外。特别是你问的gfortran对于C和C ++来说都非常好。有符号整数重写是C和C ++中未定义的行为,并且Fortran标准不允许这种行为(实际上它意味着相同,Fortran只使用不同的单词)。

答案 1 :(得分:3)

对于你的问题,这不是一个非常精确的答案,但是啊哈!在了解编译器的时候,正在学习gcc(GNU编译器集合),就像llvm一样,是three-stage compiler的一个例子。

  • '前端'解析您感兴趣的任何语言的语法,并吐出抽象语法树(AST),它以与语言无关的方式表示您的程序。
  • 然后'中间端'(可怕的名字,但是'聪明的位')将AST重新组织成另一个AST,它在语义上等同,但更容易变成机器代码。
  • 然后'后端'将重组的AST重新组装成一个或另一个处理器的汇编程序,可能会在此过程中进行特定于平台的微优化。

这就是为什么(大量)gcc / llvm选项出乎意料地与(显然是非常疯狂的)不同语言相同的原因。一些选项特定于C,或Fortran,或Objective-C,或其他任何选项,但其中大多数(可能)关注中间和最后一位,因此gcc /所有语言都是通用的llvm支持。

因此,各种选项特定于阶段1,2或3,但可能不方便地标记为这样;但是,考虑到这一点,您可能会合理地直觉了解与您感兴趣的特定语言相关的内容。

(出于这种原因,我会教条地声称CC ++ FortranJavaPerlPython本质上是一种语言,只有简单的语法和库细节来区分方言)。