提问人:M0M0 提问时间:11/1/2023 最后编辑:M0M0 更新时间:11/16/2023 访问量:151
Valgrind 抱怨从文件中读取
Valgrind complains reading from a file
问:
读取文件时,我通常会检查是否返回负数,以查看是否到达了文件末尾。read
iostat
如果使用英特尔编译器(2022 或 2023 版的 ifort 和 ifx),Valgrind 抱怨 .一个最小的例子是:Conditional jump or move depends on uninitialised value(s)
program test_reading
implicit none
integer :: err_flag
character(len = 5) :: input
do
read (*, *, iostat = err_flag) input
if (err_flag < 0) exit ! EOF
end do
end program
对于任何任意输入(这里我用字母“e”进行了测试),我从 Valgrind 收到以下警告:
$ valgrind ./a.out
==630192== Memcheck, a memory error detector
==630192== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==630192== Using Valgrind-3.19.0 and LibVEX; rerun with -h for copyright info
==630192== Command: ./a.out
==630192==
e
==630192== Conditional jump or move depends on uninitialised value(s)
==630192== at 0x41C8FD: for__characterize_LUB_buffer (in /path/to/a.out)
==630192== by 0x41CB70: for__get_s (in /path/to/a.out)
==630192== by 0x409495: for_read_seq_lis (in /path/to/a.out)
==630192== by 0x40422D: MAIN__ (test2.f90:6)
==630192== by 0x40419C: main (in /path/to/a.out)
==630192==
为什么会这样,推荐的读取文件直到结束而没有 Valgrind 任何警告的方法是什么?
当我使用 gfortran 时,我没有收到此警告。优化级别没有影响。
答:
2赞
knia
11/8/2023
#1
这是由于英特尔的实施,你对此无能为力。
我记得类似的 Valgrind 警告是由 (或 ) 语句引起的。write
print
ifort
请考虑使用忽略 .
例如,请参阅此答案。for__characterize_LUB_buffer
评论
0赞
M0M0
11/16/2023
谢谢,你有没有猜到是什么实现导致了这个警告,或者是什么?for__characterize_LUB_buffer
0赞
knia
11/16/2023
不,但我不会担心。我假设并非所有 I/O 语句都是未定义的行为,无论 Valgrinds 说什么。除非编译器已经非常崩溃,并且几代人都没有注意到。但如果您好奇,那么英特尔论坛就是您提问的地方。
评论