对C11中memset_s的安全优势存疑,请求解惑
关于C语言memset与memset_s安全优势的疑问
编程中存在不少缓冲区溢出风险,标准库的"_s"安全函数被认为可以应对这类问题,但我对部分函数的实际价值存疑。
比如这段代码存在明显的缓冲区溢出:
uint8_t a[5]; ... size_t z = 6; ... memset(a, 0, z); // 溢出!
部分C11编译器会建议改用memset_s,但如果我手滑填错参数,写出这样的代码:
uint8_t a[5]; ... rsize_t max_array = 56; // 手滑失误 rsize_t z = 6; ... memset_s(a, max_array, 0, z); // 意义何在?
我有几个疑问:
- 如果
memset_s的新参数也可能填错,那它相比memset的安全优势到底在哪里? - 我完全可以直接修正
memset的参数来实现合法操作,除了未检查空指针的情况外,memset真的比memset_s差很多吗?
编辑补充:
我找到了触发警告的设置:警告来自Visual Studio扩展Clang Power Tools调用的Clang-tidy,其默认启用security.insecureAPI.DeprecatedOrUnsafeBufferHandling检查器(模拟MSVC默认警告),该配置需从.clang-tidy文件读取,无命令行选项。我代码中定义#define _CRT_SECURE_NO_WARNINGS屏蔽了MSVC警告,但对Clang-tidy无效,因此仍收到警告。
内容的提问来源于stack exchange,提问作者LuC
相关产品推荐
相关产品推荐

