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操作会被判定为越界访问
- 64位环境下
- Fortify静态分析规则的局限性导致的误报:如果头文件引入完整,代码逻辑本身不存在缓冲区溢出风险,该告警属于Fortify的已知误报:
- 部分版本的Fortify无法正确关联动态内存分配的大小和后续操作的长度,即使
malloc和memset使用同一个长度变量sz,工具也会错误判定写入长度超出分配的缓冲区大小 - 针对动态内存分配后立即清零的场景,Fortify旧版本的规则库存在匹配错误,会误触发缓冲区溢出告警
- 部分版本的Fortify无法正确关联动态内存分配的大小和后续操作的长度,即使
内容的提问来源于stack exchange,提问作者Adam Jones
相关产品推荐
相关产品推荐

