我确信编码中存在很多缓冲区溢出风险,其中许多风险可以通过标准库的“_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
差那么多?