问题标签 [compiler-bug]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1103 浏览

c++ - 为什么在 clang -O3 上有这种行为?

这是一个计算整数除数的简短程序。该程序运行正常。然而,问题是,-O3在 Clang C++ 编译器(版本 3.3,主干 180686)的当前主干的优化标志下,程序的行为发生了变化,结果不再正确。

代码

这是代码:

正确的行为

这是使用的编译命令,以及程序在正常情况下显示的正确和预期的输出:

不正确的行为

这是用于生成提供不正确输出的二进制文件的命令行。请注意,唯一的变化是优化标志 ( -O2to -O3.)

编辑

我已经更新到树干尖端,clang 版本 3.4(树干 183073)。该行为不再重现,它应该已经以某种方式修复。任何知道它是什么问题的人,如果有一个实际验证和修复,请随时提供答案。如果没有经过验证,则可能会发生回归。

0 投票
1 回答
497 浏览

c++ - 可能的 VS2012 编译器错误(可能在整个程序优化中?)

这可能是编译器错误吗?我的环境是:

  • Win7 专业版(64 位)
  • VS2012(更新3)

我编译了下面的小控制台程序。x64 位发布/调试版本工作正常。x32 调试版本也可以正常工作。但是,x32 发布版本显示“BUG!”。

如果我禁用“整个程序优化”,这将解决问题。

有任何想法吗?

-

0 投票
2 回答
552 浏览

c# - 为什么编译器评估的余数 MinValue % -1 与运行时不同?

我认为这看起来像是 C# 编译器中的一个错误。

考虑这段代码(在方法内):

它编译时没有错误(或警告)。似乎是一个错误。0运行时,在控制台上打印。

然后没有const,代码:

当它运行时,它会正确地导致OverflowException被抛出。

C# 语言规范特别提到了这种情况,并说 aSystem.OverflowException应该被抛出。它不依赖于上下文checkedunchecked看起来(编译时常量操作数对余数运算符的错误与checkedand相同unchecked)。

int( )会发生同样的错误System.Int32,而不仅仅是long( System.Int64)。

相比之下,编译器dividend / divisorconst操作数的处理比dividend % divisor.

我的问题:

我是对的,这是一个错误吗?如果是,这是他们不希望修复的众所周知的错误(因为向后兼容性,即使% -1与编译时常量一起使用是相当愚蠢的-1)?或者我们应该报告它,以便他们可以在即将发布的 C# 编译器版本中修复它?

0 投票
3 回答
1084 浏览

c++ - c ++数组零初始化:这是一个错误,还是正确的?

注意:我们在这里谈论(据说)符合 C++98 的编译器。这不是 C++11 问题。

我们的一个编译器有一个奇怪的行为,我们不确定这是否正常或者这是一个编译器错误:

当 BBB 这样初始化时:

我们期望 BBB 的所有 POD 成员(包括 m_d,int 数组)都被初始化为零,并且 BBB 的所有非 POD 成员都被构造。

这适用于 AIX 的本机编译器、Linux/GCC-3.4、Windows/VisualC++ ......但不适用于 Solaris/SunStudio,其中只有非数组成员被零初始化。

我们在 C++98 标准(草案文档)中做了一些研究,发现以下内容:

[12.6.1 - 2]

当聚合(无论是类还是数组)包含类类型的成员并由大括号括起来的初始化器列表(8.5.1)初始化时,每个这样的成员都由相应的赋值表达式复制初始化(参见 8.5)。如果初始化器列表中的初始化器少于聚合的成员,则每个未显式初始化的成员都应默认初始化 (8.5)

然后:

[8.5 - 5]

对类型 T 的对象进行零初始化存储意味着:
如果 T 是标量类型 (3.9),则存储设置为转换为 T 的值 0(零);
— 如果 T 是非联合类类型,则每个非静态数据成员和每个基类子对象的存储都是零初始化的;
— 如果 T 是联合类型,则其第一个数据成员 89) 的存储是零初始化的;
— 如果 T 是数组类型,则每个元素的存储都是零初始化的;
— 如果 T 是引用类型,则不执行初始化。

接着:

默认初始化T 类型的对象意味着:
— 如果 T 是非 POD 类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);
如果 T 是数组类型,则每个元素都是默认初始化的;
否则,对象的存储是零初始化的。

我读它的方式:SunStudio 应该零初始化整数数组 (BBB::m_d)

奇怪的是:如果我们从 AAA 中删除默认构造函数,那么 BBB 中的所有内容都是零初始化的。

问题:当 SunStudio 未能对包含非 POD 的结构的整数数组进行零初始化时,它的行为标准吗?或者这是一个编译器错误?

0 投票
2 回答
2922 浏览

c# - 从 int 进行提升/可空转换的严重错误,允许从十进制转换

我认为这个问题会让我在 Stack Overflow 上一炮而红。

假设您有以下类型:

它的编写方式是只允许不丢失精度的安全转换。但是,当我尝试此代码时:

我很惊讶它会编译,并且在运行时会写出2. 从int(of value 2) 到的转换NumberFixedPoint2在这里很重要。(如果有人想知道,最好WriteLine使用 a的重载。)System.Decimal

为什么在地球上允许从decimal到转换?NumberFixedPoint2(顺便说一下,在上面的代码中,如果NumberFixedPoint2从结构体变为类,则没有任何变化。)

您是否知道 C# 语言规范是否说从int到自定义类型的隐式转换“暗示”存在从decimal到该自定义类型的“直接”显式转换?

它变得更糟。试试这个代码:

如您所见,我们在Nullable<>这里有(提升)转化率。但是哦,是的,那确实编译。

x86 “平台”中编译时,此代码会写出一个不可预测的数值。哪一个因时而异。例如,有一次我得到了2289956. 现在,这是一个严重的错误!

当为x64平台编译时,上面的代码使应用程序崩溃,并显示一条System.InvalidProgramException消息Common Language Runtime detected an invalid program。根据InvalidProgramException该类的文档:

通常,这表明生成程序的编译器中存在错误。

有没有人(比如 Eric Lippert,或者在 C# 编译器中使用提升转换的人)知道这些错误的原因?比如,我们在代码中没有遇到它们的充分条件是什么?因为类型NumberFixedPoint2实际上是我们在真实代码中拥有的东西(管理其他人的钱和东西)。

0 投票
2 回答
1018 浏览

c++ - Visual C++ 10.0 SP1 中的编译器错误 - cl.exe 版本 16.0.40219.1 访问冲突 [已确认]

我在使用 Visual Stuido 2010 SP1、cl.exe 版本 16.0.40219.1 编译一些模板代码时遇到了问题

以下代码将导致编译器访问冲突:

它会生成以下错误(除了“cl.exe 已停止工作,C0000005 异常):

代码在带有 g++ 的 Dev-C++ 中编译得很好(嗯,也就是说,它会发出正确的错误消息并且不会使编译器崩溃)。

编辑 然而,下面的编译很好,没有访问冲突,所以这似乎与模板有关:

您认为这值得向 Microsoft 报告吗?其他人可以重现这个吗?也许尝试在 Visual Studio 2013 中查看它是否仍然存在?

0 投票
1 回答
955 浏览

c++ - 编译器错误,或非标准代码?- lambda 中的可变参数模板捕获

我有以下 C++11 代码;

根据,我确实相信它是有效的 C++11;标准第5.1.2.23条;

省略号后的捕获是包扩展 (14.5.3)。[ 例子:

—结束示例]

然而,虽然 Clang++ 编译得很好,但 G++ 提供了这个错误;

所以我的问题很简单,这是 G++ 中的编译器错误吗?

0 投票
1 回答
268 浏览

c++ - 危险错误 Visual c++ 2005

我在使用 Visual Studio 2005 运行 C++ Win32 控制台应用程序时遇到了一个非常严重的错误。使用以下项目属性运行下面的代码(简化)时会出现问题:C++|优化|优化|/O2(或/O1,或/Ox),C++|优化|整个程序优化|/GL,链接器|优化|/ltcg

输出显示值 10 小于值 10!我已经发现将设置 /O2 更改为 /Od 可以解决问题(设置 /Og 是 /O2 的一部分会导致问题),但这确实会减慢执行时间。稍微更改代码也可以解决问题,但是嘿,我永远无法确定代码是否可靠。我正在使用 Visual Studio 2005 专业版(版本 8.0.50727.867),操作系统 Windows 7。我的问题是:有人可以尝试使用 Visual Studio 2005 重现此错误,(我已经尝试过 VS 2010,没问题),如果是这样,什么发生在这里?我可以假设较新的版本已经解决了这个问题(我考虑购买 VS 2012)谢谢

0 投票
1 回答
255 浏览

c++ - 不能通过可变参数函数将函数指针传递给父类中的方法——编译器错误?

假设您有两个结构,Generic_A并且Generic_B. Generic_B源自Generic_A。为什么当Generic_B尝试访问其父级中的方法时Generic_A,会产生以下错误:

使用 gcc 4.4.6 版编译的这段代码复制了这个问题:

两个函数调用之间唯一明显的区别是case1()具有模板实参参数,而case2()没有。他们不应该都允许您将函数指针传递给 Generic_B 的父级(即&Generic_B::p1)中的方法吗?

此外,强制转换函数指针case1似乎有时可以解决错误:

到底是怎么回事?

0 投票
1 回答
595 浏览

c++ - VC++ SFINAE 给出错误 C2070: 'overloaded-function': 非法 sizeof 操作数

错误的性质与此线程中提到的不同。
我正在尝试在 VC++ 环境中实现一种 SFINAE 方式,该方式查找一个类是否包含成员(方法)。

下面是一个简化的代码:

Method是我们正在寻找的成员方法。即使没有 C++11 ,这段代码在g++ 环境中也能正常工作。
然而,同样会导致错误的 VC++ 编译器错误:

错误 C2070:“重载函数”:非法 sizeof 操作数

我尝试了使用 SFINAE 的其他解决方法decltype,但没有运气。是否存在针对此问题的任何修复或更好的解决方法?