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

Fortify检测代码memset操作报Buffer overflow错误的原因咨询

Fortify标记memset存在缓冲区溢出的触发原因

问题代码片段如下:

char tmp[] = "hello world";
char *line;
size_t sz;

sz = strlen(tmp) +1;
line = (char*)malloc(sz);

if (line)
    memset(line, 0x00, sz);

触发该告警的常见原因分为两类:

  • 头文件缺失导致的类型隐式声明问题:如果代码没有引入stdlib.h(malloc声明)、string.h(strlen、memset声明),C89及更早的标准会默认未声明的函数返回int类型,在64位环境下会引发类型匹配问题:
    • 64位环境下size_t是64位无符号整数,strlen隐式声明返回32位int,赋值给sz时可能出现符号扩展或值截断,导致sz的实际值和预期不符
    • 64位环境下指针长度为64位,malloc隐式声明返回32位int,强制转换为char*时会出现高32位截断,导致line指向非法内存地址,后续memset操作会被判定为越界访问
  • Fortify静态分析规则的局限性导致的误报:如果头文件引入完整,代码逻辑本身不存在缓冲区溢出风险,该告警属于Fortify的已知误报:
    • 部分版本的Fortify无法正确关联动态内存分配的大小和后续操作的长度,即使malloc和memset使用同一个长度变量sz,工具也会错误判定写入长度超出分配的缓冲区大小
    • 针对动态内存分配后立即清零的场景,Fortify旧版本的规则库存在匹配错误,会误触发缓冲区溢出告警

内容的提问来源于stack exchange,提问作者Adam Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:21:03