不会被优化掉的 Memset 内存

ary*_*rye 1 c buffer memset

这与这个问题相关:有没有一种方法可以在使用完缓冲区后对其进行内存设置(例如出于安全考虑)而不对其进行优化?

尝试将指针强制转换为易失性指针,收到有关将易失性指针发送到不需要易失性的函数的警告。

Ian*_*ott 5

C23 标准草案中的函数memset_explicit()可以满足您的需求,但可能无法在当前版本的 C 标准库中实现。GNU Gnulibmemset_explicit() (GNU 可移植性库)包含一个可以根据 GNU 宽通用公共许可证条款合并到项目源代码中的版本。初始导入项目时假定该项目使用 Autoconf,因此对于不使用 Autoconf 的项目来说这可能会出现问题。

Gnulib实现memset_explicit()使用条件编译以各种方式实现该函数,例如调用memset_s()(如果可用)、在调用后添加内存屏障memset(),或者如果这些都无法使用,则memset()通过易失性函数指针进行调用。易失性函数指针的使用涉及定义和初始化函数指针,volatile_memset如下所示:

    void * (* const volatile volatile_memset) (void *, int, size_t) = memset;
Run Code Online (Sandbox Code Playgroud)

memset()通过指针进行的调用volatile_memset不会被优化掉。