bzero函数用法详解
bzero函数简介
- 头文件包含
#include <strings.h>
#include <string.h>
- 函数定义
void bzero(void * s , size_t n );
void explicit_bzero(void * s , size_t n );
bzero函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘bzero’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <strings.h>
#include <string.h>
bzero函数详细描述
bzero ()函数擦除内存中n字节中的数据,从s 指向的位置开始,将0(包含(aq\e0(aq)的字节)写入该区域。
explicit_bzero ()函数执行与bzero ()相同的任务,它与bzero ()的不同之处在于,如果编译器推断擦除操作是“不必要的”,它保证编译器优化不会删除该操作。
bzero函数返回值
一个都没有。
bzero函数其他说明
explicit_bzero ()函数解决了安全意识强的应用程序在使用bzero ():时可能遇到的一个问题,如果编译器可以推断出correct程序再也不会触及归零的位置,那么它可以完全删除bzero ()调用。如果bzero ()调用的目的是擦除敏感数据(例如密码),以防止数据被不正确或受损的程序泄露,则这是一个问题。编译器从不优化对explicit_bzero ()的调用。
explicit_bzero ()函数不能解决与擦除敏感数据相关的所有问题:
- explicit_bzero ()函数确保not可以从内存中完全删除敏感数据。bzero ())也是如此,例如,寄存器和“擦除”堆栈区域中可能有敏感数据的副本。explicit_bzero ()函数不知道这些副本,也不能擦除它们。
- 在某些情况下,explicit_bzero ()可以decrease的安全性。如果编译器确定包含敏感数据的变量可以被优化以存储在寄存器中(因为它足够小,可以容纳在寄存器中,并且除了explicit_bzero ()调用之外没有其他操作需要获取变量的地址),那么explicit_bzero ()调用将强制将数据从寄存器复制到RAM中的一个位置,然后立即擦除该位置(而寄存器中的复制不受影响)。这里的问题是,RAM中的数据比寄存器中的数据更有可能被bug暴露,因此explicit_bzero ()调用创建了一个短暂的时间窗口,在这个时间窗口中,敏感数据比不尝试擦除数据时更容易受到攻击。
请注意,使用 volatile 限定符声明敏感变量,not是否消除了上述问题。事实上,这会使它们变得更糟,因为,例如,它可能会迫使一个本来会优化到寄存器中的变量在整个生命周期内被维护在(更易受攻击的)RAM中。
尽管有上述细节,对于注重安全性的应用程序,使用explicit_bzero ()通常比不使用它更好。explicit_bzero ()的开发人员预计未来的编译器将识别对explicit_bzero ()的调用,并采取步骤确保删除敏感数据的所有副本,包括寄存器或“擦除”堆栈区域中的副本。
评论区