使用NDK的Clang编译C++代码strcpy报缓冲区溢出错误如何排查
问题根因
该报错是你的代码存在潜在越界问题,Clang的Fortify安全检查正确识别到了该隐患:
- 字符串常量
"CD001"的实际长度是6字节:包含5个可见字符+1个C语言隐式添加的字符串终止符\0 - 你定义的缓冲区
char[5] TVolumeDescriptor::StandardIdentifier只有5字节的存储空间,调用strcpy时会将终止符\0写入缓冲区外的内存,触发越界访问。
GCC未报错的原因
GCC默认没有启用高强度的编译期字符串越界检查,而Android NDK的Clang工具链默认针对移动端安全场景启用了_FORTIFY_SOURCE安全加固选项,会在编译期和运行期检测常见的内存操作错误,你遇到的就是编译期的静态检查拦截了不安全的代码。
修复方案
- 方案1:调整缓冲区大小,预留终止符存储空间
将char[5] TVolumeDescriptor::StandardIdentifier改为char[6] TVolumeDescriptor::StandardIdentifier,适配C字符串的终止符需求。 - 方案2:适配无终止符的业务场景(推荐针对ISO9660卷描述符这类原生不需要终止符的场景)
不要使用strcpy,改用memcpy明确指定拷贝长度,避免写入多余的终止符:memcpy(cTermVolumeDesc.StandardIdentifier, "CD001", sizeof(cTermVolumeDesc.StandardIdentifier)); - 方案3(不推荐):关闭Fortify安全检查
在Gradle的CMake配置的cFlags和cppFlags中添加参数关闭检查:
该方案会丢失大量安全问题检测能力,仅临时调试用,不要在正式版本中使用。cFlags '-O3', '-fsigned-char', '-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=0' cppFlags '-std=c++11', '-fsigned-char', '-fPIC', '-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=0'
内容的提问来源于stack exchange,提问作者IFThenElse
相关产品推荐
相关产品推荐

