避免警告C6386的任何方法,而不完全禁用它或代码分析

避免警告C6386的任何方法,而不完全禁用它或代码分析,c,visual-studio,code-analysis,C,Visual Studio,Code Analysis,VisualStudio2019开始显示代码分析警告,默认情况下显示为编辑器中的绿色曲线。这些对于学习C编程的学生来说可能非常有用,因为他们会发现经典错误,例如逐个数组访问 不幸的是,误报可能会完全破坏学习体验,我担心我将不得不要求学生禁用该功能,以避免他们担心不存在的问题 此短片段不会引起任何警告: #包括 内部主(空) { 尺寸n=6; int*v=malloc(n*sizeof(int)); 如果(v==NULL){ 返回1; } 对于(尺寸i=0;i文本编辑器>C/C++>实验>代码分析

VisualStudio2019开始显示代码分析警告,默认情况下显示为编辑器中的绿色曲线。这些对于学习C编程的学生来说可能非常有用,因为他们会发现经典错误,例如逐个数组访问

不幸的是,误报可能会完全破坏学习体验,我担心我将不得不要求学生禁用该功能,以避免他们担心不存在的问题

此短片段不会引起任何警告:

#包括
内部主(空)
{
尺寸n=6;
int*v=malloc(n*sizeof(int));
如果(v==NULL){
返回1;
}
对于(尺寸i=0;i
不幸的是,如果在函数中移动分配,如下所示:

#包括
整数*测试(大小)
{
int*v=malloc(n*sizeof(int));
如果(v==NULL){
返回NULL;
}
对于(尺寸i=0;i
写入“v”时,会出现警告C6386:缓冲区溢出:可写大小为“n*sizeof(int)”字节,但可能会写入“8”字节。

即使阅读堆栈溢出,我也不知道
'8'
从何而来,但更重要的是,为什么它没有认识到
I
永远不会超出范围

因此,问题是:有没有一种方法可以以不会生成警告的方式编写此类代码?


我知道我可以进入
工具>选项>文本编辑器>C/C++>实验>代码分析
并将
禁用代码分析扭曲设置为
,或使用
pragma警告(禁用:6386)
,但我宁愿避免它,当然,也不要建议我的学生使用后者。

您可以通过确保
n
的值在溢出后没有“缠绕”到
malloc
调用(如中所示),从而消除此警告(可能被视为bug)

为此,您可以将
n
参数替换为看似奇怪的
max(n,0)

int*测试(大小)
{
//int*v=malloc(n*sizeof(int));//在v[i]=i上警告C6386
int*v=malloc(max(n,0)*sizeof(int));//无警告
如果(v==NULL){
返回NULL;
}
对于(尺寸i=0;i
我真的想感谢大家的贡献,我同意(通过查看Microsoft网站,两年前它已经“关闭-优先级较低…”)

Adrian Mole
max(n,0)
trick指出了一种处理代码中警告的方法,即检查
n
是否大于零。有趣的是,你仍然可以用零来表示
n
应该使用的东西。正如John Bollinger指出的那样,这个想法可以用于有经验的程序员(这可能会禁用警告),但不适合学生

因此,在告诉学生这是一个bug以及如何关闭代码分析扭曲或禁用警告后,我同意了

int*测试(大小)
{
如果(n==0){
返回NULL;
}
int*v=malloc(n*sizeof(int));
如果(v==NULL){
返回NULL;
}
对于(尺寸i=0;i

这也可能被解释为:不允许0元素分配。

大小\u MAX/sizeof(int)
不是在错误的位置吗?这可能会导致内存泄漏。你完全正确,为这个愚蠢的错误感到抱歉。我在写问题时添加了它,认为这可能是警告的原因。无论如何,这看起来像一个典型的“假阳性”,只是分析工具中的一个缺陷。使用静态分析仪时的标准程序是禁用所有损坏和故障诊断。顺便说一句,你首先不应该用Visual Studio来教C,它是不合规的,非常过时。@Lundin:我不同意Visual Studio是“不合规的,非常过时的”这一事实,但我不会为此而进行宗教战争。我认为将命令行与
printf()
一起作为调试器工具进行教学要糟糕得多@CostantinoGrana:MS在去年9月宣布,他们刚刚在VS编译器中添加了对C11和C17的支持。是的,它已经可怕地过时了一段时间。我想这是一个侥幸,这使任何不同的警告。例如,当反转
max
@IanAbbott-Fluke的参数时,肯定会返回警告。我猜这是
max
宏的定义方式(使用三元运算符)。有趣的是,这让静态分析器相信代码是可以的,但从指导学生的角度来看,我认为演示这样一种解决方法,更不用说教学生使用它了,比带着警告生活更糟糕。至少有了这个警告,我们提醒你要注意所涉及的分配,以判断这个警告是否有充分的根据。@JohnBollinger我同意。然而,如果学生被迫使用MSVC代码分析器,那么他们的选择就很有限:教他们如何接受警告,向他们展示如何使用
#pragma
禁用警告,或者告诉他们这是MSVC中的一个bug,并向他们展示如何愚弄该工具。但我在这里提出的“变通方法”可能对其他开发人员有用,对于大型代码库,世卫组织希望在显示此类误报的地方消除该警告。