检测未初始化的数组

2023-12-06

在下面的程序中,两个例程set_int_array and set_real_array为虚拟数组定义一些值,但假设初始化a(:) and r(:)(第 1 行和第 2 行)无意中丢失了(即,这两行在正确的程序中都应该取消注释)。我的问题是如何使用某些编译器选项自动检测这些错误。

module mymod
implicit none
contains

subroutine set_int_array ( a )
    integer, intent(out) :: a(:)
    integer k
    ! a(:) = 10                              !! (1)

    do k = 1, size(a)
        a(k) = a(k) + k
    enddo
end subroutine

subroutine set_real_array ( r )
    real, intent(out) :: r(:)
    integer k
    ! r(:) = 10.0                            !! (2)

    do k = 1, size(r)
        r(k) = r(k) + k
    enddo
end subroutine

end module

program main
    use mymod
    implicit none
    integer :: a(5)
    real    :: r(5)

    call set_int_array  ( a ) ; print *, a(:)
    call set_real_array ( r ) ; print *, r(:)
end program

为此,我首先尝试了 gfortran4.8 的以下选项(在 Linux x86_64 上):

gfortran -Wall -fcheck=all test.f90

但这未能检测到丢失的初始化并给出了错误的结果

           1           2   268435459       32730         207
   1.0000000       2.0000000       3.0000000       4.0000000       5.0000000

所以我尝试了以下选项来初始化r(:) with NaN:

gfortran -finit-real=snan -ffpe-trap=invalid test.f90

成功捕获了错误set_real_array,但不适合set_int_array

 -1098847551          59 -1034862589       32608        7941

Program received signal 8 (SIGFPE): Floating-point exception.

Backtrace for this error:
#0  0x00000039becac5f4 in wait () from /lib64/libc.so.6
#1  0x00000039c501400d in ?? () from /usr/lib64/libgfortran.so.3
#2  0x00000039c501582e in ?? () from /usr/lib64/libgfortran.so.3
#3  0x00000039c50146ca in ?? () from /usr/lib64/libgfortran.so.3
#4  <signal handler called>
#5  0x0000000000400bd3 in __mymod_MOD_set_real_array ()
#6  0x0000000000400e69 in MAIN__ ()
#7  0x0000000000400f52 in main ()

因此,我也尝试了 ifort14.0 的以下选项

ifort -check all test.f90
ifort -check uninit test.f90

但两者都未能检测到错误。事实上,手册页check uninit选项说

仅限本地scalar检查不带 SAVE 属性的内部类型 INTEGER、REAL、COMPLEX 和 LOGICAL 的变量。

那么错误未被检测到是很自然的。所以我的问题是:有没有什么方法可以捕获这两个错误a(:) and r(:)自动地?


[编辑]我提出这个问题的动机来自最近的帖子在 SO 上,OP 很难找到错误。原来问题出在使用了未初始化的数组curve_derivs_alg1() in the evaluate模块,但对我来说找到错误的精确位置也非常困难(尽管一旦发现它可能显得微不足道!)。这-finit-real-snan -ffpe-trap=invalid选项在这种情况下有效,但如果整数数组是问题所在,它应该变得更加困难......所以我想知道是否有一些方便的选项或方法来跟踪使用未初始化数组的第一个位置。


如果你使用的是 Linux,你可以使用valgrind为了这个任务。如果您发出

valgrind --track-origins=yes ./a.out

你会得到很多输出;-) 第一个警告实际上指向未初始化的变量:

==4426== Memcheck, a memory error detector
==4426== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==4426== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==4426== Command: ./a.out
==4426== 
==4426== Conditional jump or move depends on uninitialised value(s)
==4426==    at 0x4F29774: ??? (in /usr/lib64/libgfortran.so.3.0.0)
==4426==    by 0x4F2B2DE: ??? (in /usr/lib64/libgfortran.so.3.0.0)
==4426==    by 0x4F1F126: _gfortran_transfer_array (in /usr/lib64/libgfortran.so.3.0.0)
==4426==    by 0x40098B: MAIN__ (test.F90:34)
==4426==    by 0x400A75: main (test.F90:28)
==4426==  Uninitialised value was created by a stack allocation
==4426==    at 0x4008CD: MAIN__ (test.F90:27)

为了更好地分析输出,我更喜欢每行一个语句,因此我将程序的最后几行更改为

    call set_int_array  ( a )
    print *, a(:)
    call set_real_array ( r )
    print *, r(:)

Then, test.F90:34指向

    print *, a(:)

稍后,您将发现以下输出,该输出指向未初始化变量的第二次使用:

==4426== Conditional jump or move depends on uninitialised value(s)
==4426==    at 0x4F27BC1: ??? (in /usr/lib64/libgfortran.so.3.0.0)
==4426==    by 0x4F2A6E4: ??? (in /usr/lib64/libgfortran.so.3.0.0)
==4426==    by 0x4F2B29E: ??? (in /usr/lib64/libgfortran.so.3.0.0)
==4426==    by 0x4F1F126: _gfortran_transfer_array (in /usr/lib64/libgfortran.so.3.0.0)
==4426==    by 0x400A44: MAIN__ (test.F90:36)
==4426==    by 0x400A75: main (test.F90:28)
==4426==  Uninitialised value was created by a stack allocation
==4426==    at 0x4008CD: MAIN__ (test.F90:27)

请注意,您需要使用调试选项编译代码才能获取行号。和valgrind从第一个错误开始纠正一个又一个错误也是有益的。这是因为未定义的行为可能会导致后续错误/警告,一旦解决问题的原因,这些错误/警告就会消失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测未初始化的数组 的相关文章

  • 指针的 Fortran 副本

    我有一个包含指针 p 的 var 类型 我需要将 var 复制到与 var 类型相同的另一个变量 var1 上 通过执行 var1 var 在引号中 因为我不知道这是否是正确的方法 请参见下文 在我的实现中 var 和 var1 被传递给一
  • PHP 生成的 XML 显示无效的 Char 值 27 消息

    我使用 PHP 库生成 XML 如下所示 dom new DOMDocument 1 0 utf 8 执行上述操作会生成一个页面 该页面在输出顶部显示一条消息 此页面包含以下错误 第 16 行第 274505 列错误 PCDATA 无效 C
  • 导航时 Internet Explorer 9 中的图像闪烁白色

    我正在使用 XHTML 1 1 CSS 3 0 开发一个网站 但 Internet Explorer 9 出现问题 每次我将页面从 主页 更改为 功能 时 各种图像在填充之前都会闪烁 白色 出现这种 白色闪烁 每次页面更改时 我见过很多堆栈
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • ISO C++ 禁止声明没有类型的“多重集”

    我在使用 waf 构建软件 ns3 时收到此错误 In file included from src internet stack mp tcp typedefs cc 6 src internet stack mp tcp typedef
  • 如何使用 cython 编译扩展?

    我正在尝试从示例页面编译一个简单的 cython 扩展here http docs cython org src userguide tutorial html在我安装了 Python 2 6 64 位版本的 Windows 7 64 位计
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中
  • 错误:-march= 开关的值错误

    我写了一个Makefile 但无法让它工作 我有一个选项应该选择编译到哪个处理器 然而 当我跑步时make从命令行它说 tandex tandex P 6860FX emulators nintendo sdks 3DS SDK HomeB
  • 在 OS X (C++) 中设置 Eclipse 错误:启动失败,未找到二进制文件?

    关于这个主题有一百万个问题 我已经阅读了所有这些问题 我的计算机上安装了 eclipse juno 运行 OS X Yosemite 我只想运行一个简单的 hello world 程序 但我不能 我不知道为什么 我确实构建了该项目 即使我这
  • “显式”关键字对返回值优化 (RVO) 有何影响?

    以下代码工作得很好 显示 RVO struct A A int cout lt lt A A n constructor A const A cout lt lt A A const A n copy constructor A foo r
  • 构造函数中的初始化和赋值有什么区别?

    让我们考虑以下类 struct test1 int a int b test1 a 0 b 0 struct test2 int a int b test2 a 0 b 0 现在 我知道了test1 构造函数是初始化数据成员的正确方法cla
  • 在Java中,为什么某些变量首先需要初始化,而其他变量只需要声明?

    我试图更深入地理解我是否遗漏了一些关于 Java 何时需要变量初始化与简单声明的理解 在以下代码中 不需要为变量 row 赋值即可编译和运行 但变量 column 则需要赋值 注意 该程序没有任何用处 它已被修剪为仅显示此问题所需的内容 以
  • Arduino CLI 编译器“ino”和一些基本草图导致编译错误

    我正在尝试使用 cli 编译器 ino 编译基本的以太网 UDP Sketch 我从他们的 github 存储库下载了最新版本 ino init然后是 src sketch ino 的内容 include
  • 如何在fortran 90中生成[0,5]范围内的整数随机数?

    我对 Fortran 编程有点陌生 任何人都可以帮我解决问题吗 我在生成整数随机数时遇到问题 在 Fortran 随机数范围 0 5 中使用 random seed 和 rand 为了支持answer https stackoverflow
  • 使用SDL和g++编译找不到-lSDLmain等

    我一直在尝试使用g 来用SDL编译程序 该程序只是一个 main cpp 文件 其中有两条 SDL 测试行 如下所示 include SDL SDL h using namespace std int main void SDL Init
  • Xcode 4:“错误:未知类型名称‘BOOL’;您的意思是‘BOOL’吗?”

    我有一个在 Xcode 3 2 x 下运行良好的项目 在 Xcode 4 2 下 编译时出现以下错误 error unknown type name BOOL did you mean BOOL 我无法右键单击违规内容BOOL并且Xcode
  • 修复 IE8 中的“未知运行时错误”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我没有看到其他人真正努力实现我的目标 很多人想通过innerHTML属性替换一些节点 但是 我不仅想这样做 而且我还想用javascrip
  • 为什么我在 Java 中收到 Unreachable Statement 错误?

    当我尝试编译时这个程序 http ideone com 7KfWn 我在第 21 行收到 无法访问的语句 错误 import java util import java io import java nio file import java
  • FORTRAN:数据多态

    我试图隐藏真实数据类型和复杂数据类型之间的差异 在 FORTRAN 2003 中 我认为可能有一种方法可以做到这一点 目标是定义一个多态可分配数组 其类型可以在运行时决定 另外 还有一个子例程 它使用多态数组来做一些代数 相同的方程适用于真
  • C 中的 if 语句和垃圾值[重复]

    这个问题在这里已经有答案了 我是 C 编程新手 我知道这是一个非常简单的问题 但我需要一些建议 我正在练习控制结构if statement 我遇到过一个例子 这是代码 include

随机推荐

  • 如何解密或访问受保护的 Access 数据库?

    我接手了一个旧的软件项目 它使用 MS Access 数据库来存储数据 但是数据库不会在 Access 中打开 如下所示 您没有使用 database mdb 对象所需的权限 请让您的系统管理员或创建此对象的人员为您建立适当的权限 但我不知
  • 步骤定义检测仅在项目配置为 Cucumber 项目时有效。- 虚拟机

    无法连接功能文件和步骤定义文件 仅在 Win Server 2012R2 虚拟机中安装的 eclipse 中才会发生 当您从 git 或直接从本地系统导入任何新的 Cucumber 项目时 将会出现此错误 因为你还没有将项目配置为cucum
  • Cassandra 3 Java 驱动程序构建动态查询

    有没有办法通过给定参数构建动态查询 public List getData String title Date dateFrom Statement statement QueryBuilder select all from test d
  • SVN:我的存储库访问时出现 500 内部服务器错误

    操作系统是Ubuntu服务器 我使用 SVN 创建一个新的存储库 如下所示 svnadmin create myrepo pre 1 6 compatible 第一次 当我想访问我的新存储库时myrepo 使用TortoiseSVN工具 我
  • 减去两个字符

    我刚刚开始汇编编程 所以我是一个初学者 为了练习 我尝试用汇编语言重写基本的 libc NASM Intel 语法 但我被困在strcmp功能 Compare two C style NUL terminated strings Input
  • 如何在 iPhone 中使用 nsdocuments 目录进行下载

    我有一个带有下载选项的iPhone应用程序 并且我使用nsdocument目录路径进行下载 但是下载后我如何才能访问iPhone中的文档路径 我需要安装任何其他应用程序来访问文件吗 如果是 请告诉我该应用程序 谢谢 NSDownloadsD
  • 将原始电子邮件(带附件)发送给多个收件人

    我目前正在使用 Python 2 7 并尝试使用 Boto SES 将带有附件 确切地说是 CSV 的原始电子邮件发送到多个地址 我可以发送普通电子邮件send email 但是当我尝试通过以下方式发送给多个人时 我不断收到错误消息send
  • 找出一个点属于哪个四面体元素

    我有一个 3d 区域的四面体网格 网格由扩展名为 node 和 ele 的两个文件定义 其中包含与节点和元素相关的数据 这是 tetgen 3d Delaunay 四面体化程序 的输出文件的格式 node 文件的每一行包含节点编号以及该节点
  • 使用“imager”包中的 load.image() 函数在 R 中加载多个图像

    我想使用 imager 包中提供的 load image 函数加载多个图像 但我收到一条错误消息 找不到文件 有人可以帮我解决这个问题吗 我尝试加载列表中的图像 并将此列表作为参数添加到 load image 函数中 但它只能读取一个文件
  • Python/html- 将多个 html 合并为一个 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我写了一个 python 脚本来将文本文件转换为 html 文件 但如果我不能把它们全部
  • 当没有给出路径时,在java中将在哪里创建一个新文件?

    在Java中 File f f new File myfile txt if f exists f createNewFile 执行上述代码时 默认分配的是哪个路径 而没有给出具体路径 当前目录 您可以通过调用以下命令获取 new File
  • 如何使用 VLC 流式传输图像/文件?

    所以我知道有很多 libVLC dll 的包装器 但我只是不知道谁准备好做我需要做的事情 我需要的很简单 在我的 C 程序中 我创建了一些位图 每秒一次或两次 我现在想使用 VLC 将位图作为视频 以 VLC 可以提供的某种格式 实时流式传
  • 在 malloc 内存上使用 sizeof() [重复]

    这个问题在这里已经有答案了 可能的重复 新手关于malloc和sizeof的问题 我正在尝试将字符串读入程序中 当我注意到字符串有时会被损坏时 我尝试了以下代码 void mallocated malloc 100 printf sizeo
  • 如何将拒绝的行重定向到另一个文件?

    这是我的来源csv file col1 col2 col3 col4 col5 col6 1 A AA X Y H 2 B CC D reject this row because CC it should be in col3 3 E F
  • Laravel 从 base64 返回图像预览

    我有 Base64 图像 我想返回图像预览而不是 Base64 代码 I tried return response base64 decode results gt getBase64Image 200 Content Type gt i
  • Bokeh 跳过分类数据的刻度标签

    我使用的是 Bokeh 版本 0 12 13 我有混合的数字和分类数据 我在 x 轴上只有一个分类数据 其余的都是数字 我将所有内容转换为分类数据来进行绘图 可能不是实现我的目标的最简单方法 现在我的 x 轴刻度标签比我需要的要密集得多 我
  • 如何在mysql中将单行拆分为多列

    简单问一下 mysql中有没有可用的函数将单行元素拆分为多列 我有一个带有字段的表行 user id user name user location 在此用户可以添加多个位置 我使用 php 将位置内爆并将其作为单行存储在表中 当我在网格视
  • Cosmos Mongo API“In”数组表达式问题

    IN 表达式有问题吗 我们遇到的问题是 即使存在 它也找不到我们要求的结果 SerialNumber V8073023 t DeviceEventDataEvent EventType NumberInt 4 isDeleted in fa
  • C++ vector > 在开始处保留大小

    在 C 中我有 vector
  • 检测未初始化的数组

    在下面的程序中 两个例程set int array and set real array为虚拟数组定义一些值 但假设初始化a and r 第 1 行和第 2 行 无意中丢失了 即 这两行在正确的程序中都应该取消注释 我的问题是如何使用某些编