问题标签 [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 投票
6 回答
14260 浏览

c# - (this == null) 在 C# 中!

由于在 C# 4 中修复了一个错误,以下程序将打印true. (在 LINQPad 中尝试)

在发布模式下的 VS2008 中,它会抛出 InvalidProgramException。(在调试模式下,它工作正常)

在 VS2010 Beta 2 中,它无法编译(我没有尝试 Beta 1);我学会了艰难的方式

有没有其他方法可以this == null用纯 C# 制作?

0 投票
4 回答
2674 浏览

c++ - 在 C++0x lambda 中是否可以看到函数局部类型定义?

我遇到了一个奇怪的问题。以下简化代码重现了 MSVC 2010 中的问题:

我在函数中本地创建的typedef在 lambda 中似乎不可见。如果我用typedef实际类型替换它,它会按预期工作。

以下是其他一些测试用例:

我现在没有可用的 g++ 来测试它。这是 C++0x 中的一些奇怪规则,还是只是编译器中的错误?

从上面的结果来看,我倾向于错误。虽然崩溃绝对是一个错误。


目前,我已经提交了两个错误报告

上面的所有代码片段都应该编译。该错误与在本地定义的范围上使用范围解析有关。(由dvide发现。)

崩溃错误与...谁知道呢。:)


更新

根据错误报告,它们都已在 Visual Studio 2010 的下一个版本中得到修复。(虽然这似乎不是这种情况;也许是 VS11。)

0 投票
1 回答
592 浏览

objective-c - 将 NSError ** 作为方法参数传递时的编译器警告

在过去的 4 个小时里,我一直在为此挠头,尝试了各种小实验,但我似乎无法弄清楚出了什么问题。这可能是编译器错误吗?

测试.m:

主.m:

这是编译器警告(来自 main.m):

警告:从不同的 Objective-C 类型传递 'initWithContentsOfURL:error:' 的参数 2 时,不兼容的 Objective-C 类型 'struct NSError **',预期的 'struct NSDictionary **'

我正在使用最新版本的 Xcode 和 Snow Leopard。

0 投票
3 回答
646 浏览

c++ - C++ 模板函数获取错误的默认值

我在 C++ 中遇到了一个真正的大脑灼热者,它以前从未发生在我身上。

问题的要点是,在调用我的(模板)函数时,我定义的默认参数的值被打乱了。只有当我使用默认值调用函数时才会发生这种情况。

我的模板函数声明如下:

稍后,在同一个标​​头中,定义如下:

现在,当我使用默认值 ( transform(vector2<double>(0, 1), view_transform)) 调用它时,我没有得到我期望的值。使用我看到transform的 VC++ 调试器zw具有“有趣”的值(根据我的经验,这意味着某些东西没有正确初始化)。

示例有趣的值是:0.0078125000000000000 和 2.104431116947e-317#DEN

现在我试着在 C++ FAQ Lite 上找到答案,用谷歌搜索它;甚至试图用舒伯特让自己平静下来,但我一辈子都想不通。我猜这真的很简单,我怀疑这是某种模板愚蠢的工作。

有没有办法获得我期望和想要的默认值,为什么它对我这样做?

编辑1:

如果我更改调用所以它使用浮点数而不是(transform(vector2<float>(0, 1), view_transform))问题就消失了。似乎只有在T=时才会发生这种情况double

编辑2:

只有当我对double和有两个专业时才会发生这种情况float。如果我在一个地方使用浮点特化,双重特化会得到奇怪的默认值。如果我更改调用该函数的所有位置,那么它会使用双倍的问题“消失”。我仍然不明白为什么,就像它在设置zand时使用了错误的偏移或其他东西一样w

编辑3:

来自 C++ Crypt 的故事:

在 matrix4.hpp 中:

如果我运行它,双重专业化的默认参数是正确的,但浮点版本将它的默认参数都设为零(0.000000),虽然更好,但它仍然不是z = 0w = 1.

编辑4:

提出了一个连接问题

0 投票
1 回答
1581 浏览

excel - VBA:是什么导致传递给 ParamArray 的这个字符串参数变成一个数字(看起来很像一个指针)?

最终编辑:它确实似乎是一个编译器错误 - 请参阅接受的答案。

在 Excel 2007 中使用 VBA,我在“Class1”中有以下代码:

以及模块中的一些模式代码:

如果像这样从立即窗口调用“外部”:

我得到了看起来很奇怪的输出:

被调用的例程是否在类模块中,是 Sub 还是 Function,以及是否有初始参数,似乎都很重要。我是否遗漏了有关 VBA 应该如何工作的内容?有任何想法吗?

奇怪的数字随着运行而变化。我说“看起来很像一个指针”,因为如果我这样称呼:

像这样:

我得到如下输出:

增加16让我怀疑,但我真的不知道。另外,传递一个值,比如调用:

工作得很好。

编辑:更多信息......如果我将'c.strange'的返回值分配给某物而不是将其丢弃,我会得到相同的行为:

有趣的是,如果我如上所述调用我的测试例程,并使用调用“数组”产生的参数,则假定的指针值会发生变化。但是,如果我这样称呼它:

即使我反复拨打电话,我也会收到相同的号码。(如果我切换到 Windows 中的另一个应用程序,比如我的浏览器,这个数字会发生变化。)所以,现在我很感兴趣的是 Excel 评估器(用括号调用)似乎缓存了它的结果......

0 投票
1 回答
961 浏览

c#-4.0 - 可能的 C# 4.0 编译器错误,其他人可以验证吗?

由于我不确切知道触发错误的具体部分,因此我不完全确定如何更好地标记它。

这个问题是 SO question c# 代码的副产品似乎以无效的方式得到优化,使得对象值变为 null,昨天晚上我试图帮助Gary。他是发现有问题的人,我只是将问题简化为一个更简单的项目,并希望在进一步处理之前进行验证,因此这里有这个问题。

如果其他人可以验证他们也遇到了这个问题,我会在 Microsoft Connect 上发布一条说明,当然我希望 Jon、Mads 或 Eric 也能看看它:)

它涉及:

  • 3个项目,其中2个是类库,其中一个是控制台程序(最后一个不需要重现问题,但是执行这个就可以显示问题,而您需要使用反射器并查看编译后的代码如果你不添加它)
  • 不完整的引用和类型推断
  • 泛型

代码可在此处获得:代码存储库

如果您想亲自动手,我将在下面发布有关如何制作项目的说明。

这个问题通过在方法调用中产生一个无效的转换来表现出来,然后返回一个简单的泛型列表,然后在返回它之前将其转换为奇怪的东西。原始代码以转换为布尔值结束,是的,一个布尔值。编译器在返回结果之前添加了从 aList<SomeEntityObject>到布尔值的强制转换,并且方法签名表示它将返回 a List<SomeEntityObject>。这反过来会导致运行时出现奇怪的问题,从方法调用的结果被认为是“优化掉”(原始问题),或者由于类似异常之一或其中一个而BadImageFormatException导致的崩溃。InvalidProgramException

在我重现这一点的工作中,我看到了void[]转换为 ,我的代码的当前版本现在转换为TypedReference. 在一种情况下,Reflector 崩溃了,因此很可能代码在这种情况下超出了希望。您的里程可能会有所不同。

以下是重现它的方法:

注意:可能有更多的最小形式可以重现该问题,但是将所有代码移至一个项目使其消失。从类中删除泛型也会使问题消失。下面的代码每次都会为我重现该问题,因此我将其保留原样。

我为下面代码中的转义 html 字符道歉,这是 Markdown 在欺骗我,如果有人知道我该如何纠正它,请告诉我,或者只是编辑问题

  1. 为 .NET 4.0 创建包含控制台应用程序的新 Visual Studio 2010 解决方案
  2. 添加两个新项目,都是类库,也是 .NET 4.0(我假设它们被命名为 ClassLibrary1 和 ClassLibrary2)
  3. 调整所有项目以使用完整的 .NET 4.0 运行时,而不仅仅是客户端配置文件
  4. 在控制台项目中添加对 ClassLibrary2 的引用
  5. 将 ClassLibrary2 中的引用添加到 ClassLibrary 1
  6. 删除默认添加到类库中的两个 Class1.cs 文件
  7. 在 ClassLibrary1 中,添加对 System.Runtime.Caching 的引用
  8. 向 ClassLibrary1 添加一个新文件,将其命名为 DummyCache.cs,然后粘贴以下代码:

    /li>
  9. 向 ClassLibrary2 添加一个新文件,将其命名为 Dummy.cs 并粘贴以下代码:

    /li>
  10. 在控制台项目的 Program.cs 中粘贴以下代码:

    /li>
  11. 构建,并确保没有编译器错误

  12. 现在尝试运行程序。这应该会因更可怕​​的异常之一而崩溃。我已经看到了 InvalidProgramException 和 BadImageFormatException,这取决于演员最终的结果
  13. 查看Reflector中Dummy.GetDummies的生成代码。源代码如下所示:

    然而reflector说(对我来说,它为你选择的演员可能会有所不同,在一种情况下,Reflector甚至崩溃了):

    /li>

现在,这里有一些奇怪的事情,除了上面的崩溃/无效代码:

  • Library2Dummy.GetDummies执行调用以从 Library1 获取类的默认缓存策略。它使用类型推断var policy = ...,结果是一个CacheItemPolicy对象(代码中为 null,但类型很重要)。

    但是,ClassLibrary2 没有对 System.Runtime.Caching 的引用,因此它不应该编译。

    事实上,如果你注释掉 Dummy 中名为 的方法TryCommentingMeOut,你会得到:

    'System.Runtime.Caching.CacheItemPolicy' 类型在未引用的程序集中定义。您必须添加对程序集“System.Runtime.Caching, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。

    为什么存在这种方法会让编译器高兴我不知道,我什至不知道这是否与当前问题有关。也许这是第二个错误。

  • 里面有一个类似的方法DummyCache,如果你恢复里面的方法Dummy,让代码再次编译,然后注释掉DummyCache上面有“Try commenting this out”注释的方法,你会得到同样的编译错误

0 投票
3 回答
20224 浏览

c# - '委托'System.Action' 不接受 0 个参数。这是一个 C# 编译器错误(lambdas + 两个项目)吗?

考虑下面的代码。看起来像完全有效的 C# 代码对吗?

我收到一个编译器错误“委托‘操作’不接受 0 个参数。” 使用 (Microsoft) C# 4.0 编译器在指定位置。请注意,您必须在不同的项目中声明 ActionSurrogate 才能显示此错误。

它变得更有趣:

我在这里偶然发现了一个 C# 编译器错误吗?

请注意,对于非常喜欢使用 lambdas 并试图创建一个数据结构库以供将来使用的人来说,这是一个非常烦人的错误......(我)

编辑:删除了错误的案例。

我复制了我的原始项目并将其剥离到最低限度以实现这一目标。这实际上是我的新项目中的所有代码。

0 投票
2 回答
414 浏览

java - 为什么会这样编译?该代码似乎打破了对类型参数的限制

在下面的测试中,TesterClass 对其两个类型参数之间的关系进行了约束。func2() 方法似乎打破了这个约束,我希望它会在某个地方(在 func2 的定义上,或者当该类与除 String 之外的任何第二个参数一起使用时)导致打字编译错误,但事实并非如此!

此外,如果我调用 func2 并将结果保存在适当类型的变量中,则编译失败(在该变量的类型上)。但是,尽管函数的返回类型在两种情况下(在向上转换之前)应该具有相同的类型,但执行相同操作并保存为更通用的类型(例如 Object)会成功。

这里发生了什么?

谢谢!

编辑:这不会在 javac 中编译(下面报告的版本)。我正在使用 Eclipse,并试图找出实际运行的编译器是什么。会更新。可能是 JDT(Eclipse 编译器)错误。

我已经为 Eclipse 的 jdt 打开了一个错误报告: https ://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

0 投票
2 回答
1423 浏览

visual-c++ - 64 位指针减法、有符号整数下溢和可能的编译器错误?

我最近在调试这段代码时费尽心思(为了简单起见,稍作修改):

当然,将两个指针的差值(std::upper_bound减去搜索数组开头的结果)分配给 int 而不是 ptrdiff_t,在 64 位环境中是错误的,但导致的特定不良行为非常出乎意料。当 [indexBegin, indexEnd) 的数组大小超过 2GB 时,我希望这会失败,因此差异会溢出 int; 但实际发生的情况是当 indexBegin 和 indexEnd 的值位于 2^31 的相反两侧时(即 indexBegin = 0x7fffffe0,indexEnd = 0x80000010)。进一步调查显示以下 x86-64 汇编代码(由 MSVC++ 2005 生成,经过优化):

此代码将被减去的指针视为带符号的 32 位值,在减去它们并将结果乘以另一个带符号扩展的 32 位值之前,将它们符号扩展为 64 位寄存器,然后用 64- 索引另一个数组该计算的位结果。尽我所能,我无法弄清楚在什么理论下这可能是正确的。如果将指针作为 64 位值减去,或者在 imul 之后是否有另一条指令,将 edx 符号扩展为 rdx(或者最终的 mov 引用了 rax+edx,但我认为这在x86-64),一切都会好起来的(名义上很危险,但我碰巧知道 [indexBegin, indexEnd) 的长度甚至永远不会接近 2GB)。

这个问题有点学术性,因为我的实际错误很容易通过仅使用 64 位类型来保存指针差异来修复,但这是编译器错误,还是语言规范中有一些模糊的部分允许编译器假设减法的操作数将分别适合结果类型吗?

编辑:我能想到的唯一情况会使编译器做得很好,如果允许假设整数下溢永远不会发生(这样如果我减去两个数字并将结果分配给 a signed int,编译器将是可以自由地实际使用更大的有符号整数类型,在这种情况下被证明是错误的)。语言规范允许这样做吗?

0 投票
3 回答
207 浏览

c++ - 为什么这个私有模板函数会编译?-> 编译器错误 VS 2009

这在 VS 2009 中编译没有问题?我傻吗?GCC 发出警告,模板是私有的......?我错过了什么?