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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:42:00