Pascal 编译器需要 SecureZeroMemory 函数吗?

Do Pascal compilers need SecureZeroMemory function?

考虑代码:

procedure DoSmthSecret;
var
  Seed: array[0..31] of Byte;

begin
// get random seed
  ..
// use the seed to do something secret
  ..
// erase the seed
  FillChar(Seed, SizeOf(Seed), 0);
end;

代码的问题是:FillChar 是一个编译器固有的,编译器可能 "optimize it out"。该问题对于 C/C++ 编译器来说是已知的,请参阅 SecureZeroMemory。现代 Pascal 编译器(Delphi、FPC)能否进行此类优化,如果可以,它们是否提供等效的 SecureZeroMemory?

FPC 目前无法进行此类优化,即使使用 C++,afaik 它们也属于 "uncertain" class。 (由于此优化导致的程序状态忽略了程序员告诉它的状态)

解决此类问题需要定义哪些结构可以优化,哪些不可以。它本身不需要 API/OS 帮助,任何具有此类功能的外部链接目标文件都可以(因为那时全局优化不会触及它)

请注意,这篇文章没有具体命名 C++ 编译器,所以我希望它更像是一个通用实用函数,用于编译器用户遇到问题时,无需太费力地查看文档,或者当它必须时轻松地在多个(windows-only!)编译器上工作,而不会使构建系统过于复杂。

选择一个不可内联的 API 函数在其他情况下可能不是最优的,特别是对于小的、常量为零的函数,因为它不会被内联,所以我会小心使用这个函数,并且确保有迫切需要

这可能很重要,主要是当外部实体可以更改程序的内存(DMA、内存映射等),或者从内存映像中删除密码和其他敏感信息时,即使根据编译器的程序将从未读过

即使 if FreePascal 也会优化写入永远不会再次读取的内存(我怀疑它会自动取款机,不管你们讨论了多长时间),它确实支持absolute 类型修饰符,它保证(已记录)永远不会优化(有点类似于 C/C++ 中的 volatile)。