You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:37:30