奇怪的"random"内部编译器错误在C++生成器 2010

Strange "random" internal compiler error in C++ builder 2010

本文关键字:C++ 2010 编译器 random 内部 错误      更新时间:2023-10-16

我有一些代码可以将一堆 TNotifyEvents 放在一个向量中。

std::vector<TNotifyEvent> m_availableCallbacks;

这是应用程序主窗体的成员。在窗体构造函数中,它填充了事件。

m_availableCallbacks.push_back(ReadoutLastValue);
m_availableCallbacks.push_back(ReadoutCurrentDay);
m_availableCallbacks.push_back(ReadoutLastDay);
m_availableCallbacks.push_back(Readout7Days);
m_availableCallbacks.push_back(Readout1Month);
m_availableCallbacks.push_back(ReadoutChooseTimeSpan);
m_availableCallbacks.push_back(ReadoutAllData);

然后迭代此向量并用于创建弹出菜单并将通知事件分配给该弹出菜单中的元素。

在本地编译它没有问题。当我在构建服务器(运行 TeamCity 6.5)上编译它时,我在等于第二个push_back调用的行上收到内部编译器错误。

我尝试通过编辑 cbproj 文件在构建代理上本地禁用智能缓存预编译标头。这产生了一个成功的构建。因此,我从所有 cbproj 文件中删除了使用智能缓存预编译标头的指令并提交了更改。我告诉TeamCity进行一次干净的检出,我再次在同一个地方遇到了同样的内部编译器错误。奇怪的是,在失败的编译成功后运行新的编译,所以这感觉非常随机。

这是怎么回事?我习惯于在其他C++编译器中传递函数指针(由我自己装箱)。是 TNotifyEvents 的内部处理中断了,还是编译器不稳定且容易损坏?

查看其他采用 TNotifyEvents 的代码,它们不适用于引用或指针,所以我没有尝试。而且由于代码(编译时)按预期工作,这似乎不是问题。

更新:

我可以补充一点,TeamCity 的日志说,当我重新运行编译并且它成功时,前端.cpp文件(包含此代码)将被跳过

[10:04:37]: [MakeObjs] CallTarget
[10:04:37]:   [CallTarget] _CppDepCheck
[10:04:44]:     [_CppDepCheck] MessageMap
[10:04:44]:       [MessageMap] Skipping: ..., FrontEnd.cpp, ...

为了使它甚至工作,当发生内部编译器错误时,编译必须成功。否则它怎么能跳过编译文件,仍然神奇地出现并以编译形式使用?:)

更新2

经过调查,我可以确认这仅在以发布模式编译时发生。在发布中,它甚至发生在 IDE 中的本地计算机上。我试过摆弄这样的设置

  • 禁用所有优化
  • 生成最快的代码
  • 外部类型文件
  • 等等

在每次尝试之间清理构建。但ICE并没有消失。但是,我确实设法让它抱怨另一个文件中的另一个位置。将设置回以前的设置不会使错误返回到 FrontEnd.cpp 文件。这个编译器感觉有点摇摇欲坠:)

事实上,我开始让ICE遍布代码,并且必须重新启动IDE才能编译任何内容。

这似乎与 std::vector 有关。不确定它是自己损坏还是密件抄送处理的方式是问题所在。但是切换到 C 样式数组作为测试反而使 ICE 消失,它现在在调试和发布模式下都可以正常工作。

TNotifyEvent m_availableCallbacks[7];

我想避免这种情况,因为向向量添加新事件几乎只涉及一行代码。现在也会有更多的事情要记住要改变。但是,最好让应用程序编译。

如果我错误地认为这是密件抄送中的一个错误,请纠正我,以便我可以尽快回到使用矢量:)......否则我希望内河码头尽快解决这个问题。