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永远不会越界。
因此问题是:有没有一种方法可以编写此类代码而不会生成警告?
我知道可以转到工具 > 选项 > 文本编辑器 > C/C++ > 实验性 > 代码分析
并将禁用代码分析下划线
设置为True
,或使用#pragma warning(disable:6386)
,但我宁愿避免这样做,当然也要避免建议我的学生后者。
printf()
作为调试工具来进行教学要糟糕得多... - Costantino Granan
可能不一定在SIZE_MAX
处回绕”,在这种情况下,我认为这只是malloc
(+realloc
,calloc
)实现需要担心的事情。 - Ian Abbott