我研究了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编译器选项?
答案 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>
)
}
}
,gcc
和g++
调用。
实际上它更复杂,您可以在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的一个例子。
这就是为什么(大量)gcc / llvm选项出乎意料地与(显然是非常疯狂的)不同语言相同的原因。一些选项特定于C,或Fortran,或Objective-C,或其他任何选项,但其中大多数(可能)关注中间和最后一位,因此gcc /所有语言都是通用的llvm支持。
因此,各种选项特定于阶段1,2或3,但可能不方便地标记为这样;但是,考虑到这一点,您可能会合理地直觉了解与您感兴趣的特定语言相关的内容。
(出于这种原因,我会教条地声称CC ++ FortranJavaPerlPython本质上是一种语言,只有简单的语法和库细节来区分方言)。