gpt4 book ai didi

c++ - MSVC C6029 警告 : possible buffer overrun, 使用未经检查的值。检查缓冲区大小时警告不会消失

转载 作者:太空狗 更新时间:2023-10-29 21:31:45 32 4
gpt4 key购买 nike

我的代码中有烦人的 C6029 警告 ( description of the error on the Microsoft website )。

例如:

#include <cstdio> // fopen, fseek, fread, fclose

static constexpr size_t MAX_BUFFER_SIZE = 100;

void foo(const FILE* myFILE)
{
double buffer[MAX_BUFFER_SIZE]{};
size_t bufferSize = 0;

std::fread(&bufferSize, sizeof(size_t), 1, myFILE);

std::fread(buffer, sizeof(double), bufferSize, myFILE); // C6029 Warning.
}

只有在观察到一项特定检查时它才会消失(如错误描述中的示例):

#include <cstdio> // fopen, fseek, fread, fclose
static constexpr size_t MAX_BUFFER_SIZE = 100;
void foo(const FILE* myFILE)
{
double buffer[MAX_BUFFER_SIZE]{};
size_t bufferSize = 0;

std::fread(&bufferSize, sizeof(size_t), 1, myFILE);

if(sizeof(double) * bufferSize > sizeof(buffer))
{
return;
}

std::fread(buffer, sizeof(double), bufferSize, myFILE); // No C6029 Warning.
}

这样的解决方案不适合我,因为如果超过允许值,我还需要从文件中读取其他内容。

但是如果我检查一个等效的案例,警告仍然存在:

#include <cstdio> // fopen, fseek, fread, fclose
static constexpr size_t MAX_BUFFER_SIZE = 100;
void foo(const FILE* myFILE)
{
double buffer[MAX_BUFFER_SIZE]{};
size_t bufferSize = 0;

std::fread(&bufferSize, sizeof(size_t), 1, myFILE);

if(sizeof(double) * bufferSize <= sizeof(buffer))
{
std::fread(buffer, sizeof(double), bufferSize, myFILE); // C6029 Warning, again.
}
}

同时,如果你稍微修改一下微软推荐的检查,从而导致错误发生,警告就会神奇地消失:

#include <cstdio> // fopen, fseek, fread, fclose
static constexpr size_t MAX_BUFFER_SIZE = 100;
void foo(const FILE* myFILE)
{
double buffer[MAX_BUFFER_SIZE]{};
size_t bufferSize = 0;

std::fread(&bufferSize, sizeof(size_t), 1, myFILE);

if(sizeof(double) * bufferSize <= sizeof(buffer))
{
// DO NOTHING...
}

std::fread(buffer, sizeof(double), bufferSize, myFILE); // Wow, magic! No C6029 Warning.
}

这个错误警告让我非常恼火。当然,我可以根本不注意它,但我仍然想以“合法”的方式摆脱它(最好在语法上不要太糟糕)。

最佳答案

Such a solution does not suit me, because if the permissible value is exceeded, I still need to read other things from the file.

然后不要std::fread 没有缓冲区的有问题的部分。例如,您可以 std::fseek 覆盖它。或者您可以动态分配足够大的缓冲区。

关于c++ - MSVC C6029 警告 : possible buffer overrun, 使用未经检查的值。检查缓冲区大小时警告不会消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57384635/

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