Valgrind 抱怨从文件中读取

Valgrind complains reading from a file

提问人:M0M0 提问时间:11/1/2023 最后编辑:M0M0 更新时间:11/16/2023 访问量:151

问:

读取文件时,我通常会检查是否返回负数,以查看是否到达了文件末尾。readiostat

如果使用英特尔编译器(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 时,我没有收到此警告。优化级别没有影响。

IO Valgrind 英特尔-Fortran

评论

1赞 Vladimir F Героям слава 11/1/2023
您使用哪种编译器?哪个版本?
1赞 Paul Floyd 11/1/2023
哪个操作系统和什么输入?我在 FreeBSD 13.2 amd64、Valgrind 3.22 上尝试了几次 gfortran 12.2,没有出现任何错误。
0赞 M0M0 11/2/2023
这似乎只在使用英特尔编译器(ifort 或 ifx)时才会发生。优化级别无关紧要。一切都在 Rocky Linux 9 下使用英特尔 oneAPI 的 2023 和 2022 版本进行了测试。
1赞 knia 11/8/2023
请考虑将标题更改为“Valgrind 抱怨从文件中读取”。您似乎已经发现它与使用循环无关。

答:

2赞 knia 11/8/2023 #1

这是由于英特尔的实施,你对此无能为力。 我记得类似的 Valgrind 警告是由 (或 ) 语句引起的。writeprintifort

请考虑使用忽略 . 例如,请参阅此答案for__characterize_LUB_buffer

评论

0赞 M0M0 11/16/2023
谢谢,你有没有猜到是什么实现导致了这个警告,或者是什么?for__characterize_LUB_buffer
0赞 knia 11/16/2023
不,但我不会担心。我假设并非所有 I/O 语句都是未定义的行为,无论 Valgrinds 说什么。除非编译器已经非常崩溃,并且几代人都没有注意到。但如果您好奇,那么英特尔论坛就是您提问的地方。