gpt4 book ai didi

c++ - 为什么此代码在 Visual Studio 2012 的代码分析中发出缓冲区溢出警告 (C6385/C6386)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:01 25 4
gpt4 key购买 nike

我正在尝试使用 Visual Studio 2012 的代码分析功能。我刚刚在我现有的项目上运行它们,并在包含我自己的实现的部分上发现了一些缓冲区溢出警告(C6385/C6386) Knuth 的减法 PRNG(又名 RAN3)。但是,我不明白为什么会发生这种情况,因为它看起来很好(我看不到越界读/写)。所以我对该部分做了一个简短的等价物(如下),但仍然收到相同的警告并且无法找出它们的原因。

int main() {
unsigned int k = 1U, seed = 12345U, randomNumbers[55];

randomNumbers[54] = seed;
for(unsigned int i = 1U; i <= 54U; ++i) {
unsigned int ii = ((21U * i) % 55U) - 1U;
randomNumbers[ii] = k;
k = seed - k;
seed = randomNumbers[ii];
}

return 0;
}

使用上面的代码,我在第 7 行收到 C6386 警告,在第 9 行收到 C6385 警告。这段代码有什么问题?我错过了什么吗?

最佳答案

g++ 4.8 和 clang++ 3.3 编译它时没有警告或错误(使用 -Wall -Werror)。事实上,我们可以使用 C++11 的 std::array 及其 at获取边界检查的方法,以及

#include <array>

int main() {
unsigned int k = 1U, seed = 12345U;
std::array<int,55> randomNumbers;

randomNumbers.at(54) = seed;

for(unsigned int i = 1U; i <= 54U; ++i) {
unsigned int ii = ((21U * i) % 55U) - 1U;
randomNumbers.at(ii) = k;
k = seed - k;
seed = randomNumbers.at(ii);
}

return 0;
}

正如您所声称的那样,不会产生越界访问。我认为你的代码很好。 VS担心((21U * i) % 55U) - 1U)这行可能会导致0 - 1,会溢出,因为ii 是一个无符号整数。如果您使用整数而不是无符号整数,VS 是否仍然会报错?

(使用 Python,您的索引映射看起来不错:

>>> sorted([21*n % 55 - 1 for n in range(1,55)])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53]

不应该有任何越界错误,尤其是因为您不会使用无符号整数“达到”-1。)

关于c++ - 为什么此代码在 Visual Studio 2012 的代码分析中发出缓冲区溢出警告 (C6385/C6386)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17762498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com