考虑以下最小工作示例:
program p
type t
integer,allocatable::i
end type
type(t),allocatable::o
allocate(o)
deallocate(o)
end
此代码是使用英特尔编译器 (
ifx 2024.2.1
) 和标志 -O2 -g
编译的。使用英特尔检查器 (inspxe-cl 2022.1
) 和选项 --collect mi3
分析可执行文件会导致错误:
P1: Error: Mismatched allocation/deallocation: New
P1.2: Error: Mismatched allocation/deallocation: New
a.out!0x8ac1: Error X2: Mismatched deallocation site: Function do_deallocate_all: Module ./a.out
./a.f90(6): Error X3: Allocation site: Function MAIN_: Module ./a.out
将编译优化标志更改为
-O0
不会删除deallocate
语句,并且以a.out!0x8ac1
开头的错误行将指向代码中包含此语句的行:
./a.f90(7): Error X2: Mismatched deallocation site: Function MAIN_: Module ./a.out
为什么英特尔 Inspector 认为这是一个错误以及如何修复它?
正如问题评论中已经讨论的那样,这是英特尔检查器的误报。截至 2024 年 3 月 28 日,该软件已已弃用,因此此问题不会得到解决。英特尔建议在新版本的编译器中使用 Sanitizer(例如
-fsanitize=address
编译标志)或 Vagrind。
(我认为,如果有人偶然发现同样的问题,保留这个问题是明智的。)