Fermat618's Blog

Happy coding

gfortran 新坑: 未初始化的变量不会给警告

每当遇到些意外的时候,也就是初坑了的时候,我就要写篇日志了。

这两天模拟一篇 PRL 上文章,结果一直不对。我一直以为是随机模拟的数据错了,最后用了一个很笨的办法,看出来,原来是理论曲线算错了。

这实在是一个很奇怪的事情,因为算理论曲线的那个程序,相当清晰,而且是在我加了 -Wall 参数编译以后,没有任何警告就通过了。程序运行起来也没有任何的问题,但是结果不对。

只好拿着代码,一行一行慢慢看,寻找每一个变量的来源,与公式进行对照。忽然间,发现一个参数定义了,但是没有初始化。这頗为让我惊讶。如果一个变量声明了,没有使用,会有一个警告的。但变量声明了,没有定义而使用了,竟然半点警告也没有。

我记不清Fortran标准里面有没有规定一个变量如果没有初始化,哪种情况下会被初始化为 0。在 C 语言里面,函数里面的自动变量(main也是函数), 如果没有初始化,值会是随机的,不管是教科书,还是编译器,都给了警告。gfortran 竟然不会给警告,真是难以让人相信。

我继续查看 gfortran 的文档,想开启更多的检查开关,结果发现了如下一些项。


-ffpe-trap=invalid,zero,overflow,underflow,denormal


开启浮点数异常的检查,以及

-finit-real=snan

来把real型变量初始化为 snan. snan 是在开了检查之后会报错的 Nan.