gpt4 book ai didi

c++ - 这是 MSVC++ 2017 更新 3 中的编译器错误吗

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

#include <vector>

std::vector<int>::iterator foo();
void bar(void*) {}

int main()
{
void* p;
while (foo() != foo() && (p = 0, true))
{
bar(p);
}
return 0;
}

错误结果:

c:\users\jessepepper\source\repos\testcode\consoleapplication1\consoleapplication1.cpp(15): error C4703: potentially uninitialized local pointer variable 'p' used

最佳答案

这是一个错误,但对于您编写的代码类型来说非常典型。

首先,这不是错误,而是警告。 C4703 是 4 级警告(意味着默认情况下甚至不启用)。因此,为了将其报告为错误(从而中断编译),传递了编译器参数或编译指示以启用此警告并将其转换为错误(/W4/Werror 是我认为最有可能的)。

然后在编译器中进行权衡。数据流分析应该有多复杂才能确定变量是否实际上未初始化?它应该是过程间的吗?它越复杂,编译器就越慢(并且由于停止问题,这个问题可能无论如何都无法确定)。越简单,得到的误报就越多,因为保证初始化的条件太复杂,编译器无法理解。

在这种情况下,我怀疑编译器的分析是这样进行的:对 p 的赋值是在一个条件语句之后(它只发生在 foo() != foo())。 p 的用法也在条件后面(只有当复杂的 and-表达式为真时才会发生)。编译器无法在这些条件之间建立关系(分析不够复杂,无法意识到 foo() != foo() 是整个 while 循环条件为真的前提条件)。因此,编译器错误地假设访问可以在没有事先初始化的情况下发生并发出警告。

所以这是一个工程权衡。您可以报告错误,但如果您这样做,我建议您提供一个更有说服力的惯用代码的真实示例,以支持使分析更复杂。您确定不能重组原始代码以使其更易于编译器使用,同时更易于人类阅读吗?

关于c++ - 这是 MSVC++ 2017 更新 3 中的编译器错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49168300/

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