首页 > 解决方案 > 在 Visual C++(缓冲区溢出)中处理 C6386 的“正确”方式?

问题描述

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

void foo(unsigned int m, int n, unsigned int x, unsigned int y) {
    unsigned int a[50][50];
    memset(a, 0, 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这里看到的虚拟循环,而且几乎从不暴露真正的问题。是否有避免此类警告的最佳做法?

标签: c++visual-c++visual-studio-2019

解决方案


推荐阅读