结构体初始化

这个是我在项目中新看到的一个写法

有一个结构体,如果没有初始化,他存的值是随机的,这个我能理解,但是为了安全清零,他们这里的操作我就无语了,感觉怎么呢------特别安全,安全到极致。

首先讲讲我的习惯,我以前是搞c++的,咱们想一个结构体初始化而已,有什么复杂的,直接在初始化的时候直接给他赋值空不就行了。

像这样

ProxyChannelInfoDetail info = {0};

解释一下,ProxyChannelInfoDetail是一个结构体。

openharmony不是这样做的,他们是

ProxyChannelInfoDetail info;
(void)memset_s(&info, sizeof(ProxyChannelInfoDetail), 0, sizeof(ProxyChannelInfoDetail));

这行的作用是:将 info 结构体的所有字节清零

memset_s 参数解析

memset_s 是 C11 标准引入的安全版本 memset,原型为:

errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n);
参数 此处传入 含义
s &info 目标地址
smax sizeof(ProxyChannelInfoDetail) 缓冲区总大小(安全边界)
c 0 填充值(0 = 清零)
n sizeof(ProxyChannelInfoDetail) 实际要设置的字节数

为什么这个项目选了 memset_s

  1. 编码规范要求:很多安全编码规范(如 CERT C、MISRA C)推荐对所有缓冲区操作使用 memset_s 等安全函数,项目可能统一要求用 *_s 系列函数,保持风格一致。
  1. 结构体中有柔性数组或特殊成员{0} 只能零初始化标准成员,如果结构体后续被扩展或包含指针成员,memset_s 能确保所有字节都是 0,包括可能的填充字节(padding)。而 {0} 理论上也零初始化填充字节,但某些编译器在特定优化下可能不完全清零 padding。
  1. 团队/项目习惯:OpenHarmony 项目大量使用 memset_s,这是统一的安全函数调用风格,全项目保持一致比混用两种方式更易维护。

{0} 的优势

  • 更简洁,一行搞定
  • 编译期完成,没有运行时函数调用开销
  • 不会写错参数(memset_s 有 4 个参数可能写错)

分片解密规范

传输层在加密完成后会立即清零密钥,防止密钥残留在栈上被泄露。这是安全编程的基本要求。

(void)memset_s(cipherKey.key, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐