gpt4 book ai didi

c - 任何避免警告 C6386 的方法,无需禁用它或完全代码分析

转载 作者:行者123 更新时间:2023-12-04 08:37:50 28 4
gpt4 key购买 nike

Visual Studio 2019 开始默认将代码分析警告显示为编辑器内的绿色波浪线。这些对于学习 C 编程的学生来说可能非常有用,因为它们可以捕捉到经典错误,例如访问一个数组时关闭。

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

这个简短的片段不会引起任何警告:

#include <stdlib.h>

int main(void)
{
size_t n = 6;
int *v = malloc(n * sizeof(int));
if (v == NULL) {
return 1;
}
for (size_t i = 0; i < n; ++i) {
v[i] = i;
}
free(v);
return 0;
}

不幸的是,如果您在函数中移动分配,如下所示:

#include <stdlib.h>

int *test(size_t n)
{
int *v = malloc(n * sizeof(int));
if (v == NULL) {
return NULL;
}
for (size_t i = 0; i < n; ++i) {
v[i] = i;
}
return v;
}

int main(void)
{
size_t n = 6;
int *v = test(n);
free(v);
return 0;
}

您收到 警告 C6386:写入“v”时缓冲区溢出:可写大小为“n*sizeof(int)”字节,但可能写入“8”字节。

即使阅读 Stack Overflow,我也不知道 '8' 的来源,但更重要的是,为什么它无法识别 i 永远不会超出范围。

所以问题是:有没有办法以一种不会产生警告的方式编写这种类型的代码?

我知道我可以转到 Tools > Options > Text Editor > C/C++ > Experimental > Code Analysis 并将 Disable Code Analysis Squiggles 设置为 True ,或使用 #pragma warning(disable:6386),但我宁愿避免使用它,当然也避免建议我的学生使用后者。

最佳答案

我真的要感谢大家的贡献,我同意 it is a bug in the Code Analyzer (通过查看 Microsoft 网站,两年前它已被“关闭 - 低优先级”...)。

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

因此,在告诉学生这是一个错误 以及如何关闭代码分析波浪线或禁用警告后,我会选择

int *test(size_t n)
{
if (n == 0) {
return NULL;
}
int *v = malloc(n * sizeof(int));
if (v == NULL) {
return NULL;
}
for (size_t i = 0; i < n; ++i) {
v[i] = i;
}
return v;
}

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

关于c - 任何避免警告 C6386 的方法,无需禁用它或完全代码分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64713842/

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