微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Visual C++ 中处理 C6386 的“正确”方式缓冲区溢出?

如何解决在 Visual C++ 中处理 C6386 的“正确”方式缓冲区溢出?

我有一个触发缓冲区溢出警告的代码片段:

void foo(unsigned int m,int n,unsigned int x,unsigned int y) {
    unsigned int a[50][50];
    memset(a,50*50*sizeof(unsigned int));

    unsigned char odd = (x + y) % 2;
    
    for (int dummy = 0; dummy < n; ++dummy)
    {}

    for (int row = 0; row < m; ++row) {
        for (int col = (odd+row+1)%2; col < n; col += 2)
                a[row][col] = 0;
    }
}

触发警告的行是 a[row][col] = 0;,它认为 col 可能变为负值。如果我执行以下任何操作,警告就会消失:

  • 在 for 语句中包含 && col >= 0(这会向循环添加不必要的检查,因为在实际代码中我已经检查了变量边界并且知道我永远不会溢出)
  • 删除代码片段中间的虚拟 for 循环(奇怪,我知道,在实际代码中,“虚拟”循环正在执行实际工作)
  • dummy 更改为 size_t(奇怪,与带有警告的循环无关)
  • n 更改为 unsigned int(同样很奇怪,与所讨论的循环无关)
  • odd 初始值设定项中删除 col 变量(这会使代码不正确)
  • 使用 #pragma 忽略问题(我通常更愿意避免)

行不通的事情:

  • 检查 for 循环上方任何可能导致溢出的范围(我尝试了范围检查 mnxy,甚至 { {1}})。
  • odd 更改为类似 size_t 的无符号类型,或进行任何类型的无符号转换

所有解决方法都没有让我感到温暖和模糊。我最近经常看到这样的警告,通常对不相关的代码部分有古怪的依赖性,比如这里看到的虚拟 col 循环,而且几乎从来没有暴露真正的问题。是否有避免此类警告的最佳做法?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。