安全编程规范
·
结构体初始化
这个是我在项目中新看到的一个写法
有一个结构体,如果没有初始化,他存的值是随机的,这个我能理解,但是为了安全清零,他们这里的操作我就无语了,感觉怎么呢------特别安全,安全到极致。
首先讲讲我的习惯,我以前是搞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?
- 编码规范要求:很多安全编码规范(如 CERT C、MISRA C)推荐对所有缓冲区操作使用
memset_s等安全函数,项目可能统一要求用*_s系列函数,保持风格一致。
- 结构体中有柔性数组或特殊成员:
{0}只能零初始化标准成员,如果结构体后续被扩展或包含指针成员,memset_s能确保所有字节都是 0,包括可能的填充字节(padding)。而{0}理论上也零初始化填充字节,但某些编译器在特定优化下可能不完全清零 padding。
- 团队/项目习惯:OpenHarmony 项目大量使用
memset_s,这是统一的安全函数调用风格,全项目保持一致比混用两种方式更易维护。
{0} 的优势
- 更简洁,一行搞定
- 编译期完成,没有运行时函数调用开销
- 不会写错参数(
memset_s有 4 个参数可能写错)
分片解密规范
传输层在加密完成后会立即清零密钥,防止密钥残留在栈上被泄露。这是安全编程的基本要求。
(void)memset_s(cipherKey.key, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
更多推荐


所有评论(0)