繁体   English   中英

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

[英]Is this a compiler bug in MSVC++ 2017 update 3

#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):错误C4703:使用了未初始化的本地指针变量'p'

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

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

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

在这种情况下,我怀疑编译器的分析工作如下:对p的赋值在条件后面(只有在foo() != foo()时才会发生)。 p的用法也在条件之后(只有当复数和表达式为真时才会发生)。 编译器无法在这些条件之间建立关系(分析不够复杂,无法实现foo() != foo()是整个while循环条件为真的前提条件)。 因此,编译器错误地认为访问可能在没有事先初始化的情况下发生并发出警告。

所以这是一个工程权衡。 您可以报告错误,但如果您这样做,我建议您提供一个更具吸引力的现实世界的惯用代码示例,以支持使分析更复杂。 您确定无法重构原始代码以使其更易于编辑,并且同时对人类更具可读性吗?

我做了一些VC ++ 2017预览试验。

这绝对是一个bug bug。 这使得编译和链接可能正确的代码变得不可能,而且有点臭。

警告是可以接受的。 (参见@SebastianRedl回答。)但是在最新最好的VC ++ 2017中,它被视为错误,而不是警告,即使关闭警告,并将“将警告视为错误”设置为否。发生了奇怪的事情。 “错误”被推迟了 - 在它说“生成代码”之后。 我猜,并且只是猜测,“生成代码”传递正在进行全局分析,以确定是否可以进行未初始化的访问,并且它是错误的。 即便如此,你应该能够禁用错误IMO。

我不知道这是否是新行为。 读塞巴斯蒂安的回答,我认为是。 当我在任何级别发出任何警告时,我总是在代码中修复它,所以我不知道。

Jesse,单击Visual Studio右上角附近的三角形标志,然后进行报告。

肯定这是一个错误。 我试图以各种可能的方式删除它,包括#pragma。 真实的是,这被报告为错误,而非微软所说的警告。 这是微软的一个大错误。 这不是一个警告,这是一个错误。 请不要再重复这是一个警告,因为它不是。 我正在做的是尝试编译一些第三方库,其源代码我不想以任何方式修复,并且应该在正常情况下编译,但它不能在VS2017中编译,因为臭名昭着的“错误C4703:可能未初始化本地指针变量***使用“。 有人找到了解决方案吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM