错过memset_s(C11)的重要原因

问题描述 投票:0回答:0

我确信编码中存在很多缓冲区溢出风险,其中许多风险可以通过标准库的“_s”safe函数解决。尽管如此,我发现自己有时对其中一些感到困惑。

假设我有一些像这样的片段

uint8_t a[5];
...
size_t  z = 6;
...
memset(a, 0, z);  // Overflow!

一些编译器(C11)可能会建议更好地使用

memset_s
;因为我是一个糟糕的程序员,所以我只是以我的方式更新了我的代码到这个全新的东西:

uint8_t  a[5];
...
rsize_t  max_array = 56;  // Slipped finger, head in the clouds, etc.
rsize_t  z = 6;
...
memset_s(a, max_array, 0, z);  // So what?

如果我只是将错误添加到另一个参数,

memset_s
会比
memset
更好吗?

增加的安全性在哪里,如果添加一个新参数只是添加一个可能会出错的新参数。我本可以在第一个修订版中更正我的代码,并且仍然可以合法地调用缓冲区上定义良好的操作。

抛开带有未经检查的零指针的情况,

memset
怎么会比memset_s差那么多

c c11
© www.soinside.com 2019 - 2024. All rights reserved.