首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么c++应用程序可能不正确地计算表达式?

为什么c++应用程序可能不正确地计算表达式?
EN

Stack Overflow用户
提问于 2013-03-25 11:29:33
回答 1查看 255关注 0票数 1

当我写这个问题的时候,我突然意识到,由于嵌入式和非嵌入式应用程序的构建,我们可能会使用两个版本的Qt。我们都在使用gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)。我的构建环境是:

代码语言:javascript
复制
QMake version 2.01a
Using Qt version 4.7.3 in /usr/local/Trolltech/QtEmbedded-4.7.3/lib

至少我的一个同事正在使用:

代码语言:javascript
复制
QMake version 2.01a
Using Qt version 4.7.2 in /usr/lib

我的两个同事在开发使用我的计算库的独立应用程序时遇到了问题。我们的主应用程序和我的独立单元测试应用程序工作得很好,并且我的调查没有发现我的代码有任何问题。我的结论是,构建环境或编译器肯定存在一些基本问题,因为在这两种情况下,我们都隔离了不稳定/非标准的行为。我隔离的案例如下:

代码语言:javascript
复制
void className::functionName(float newDeltaTime)
{
    float zero_ = 0;
    std::cout << "newDeltaTime: " << newDeltaTime << std::endl;
    std::cout << "zero_: " << zero_ << std::endl;
    std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
    std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
    std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
...

这将输出以下内容:

代码语言:javascript
复制
newDeltaTime: 0.2
zero_: 0
newDeltaTime > zero_: 0
newDeltaTime > zero_: 1
newDeltaTime > zero_: 1

使用gdb (由QtCreator运行),我们可以在每一行看到正确的、未损坏的变量值。这就是我真正感到奇怪的地方。调试器显示的变量没有任何更改,但是完全相同的表达式第二次会产生不同的值。

最初,我有一些错误检查,说if(newDeltaTime > 0) { //do something } else { //log and throw }和我的老板向我展示了抛出值为0.2的异常的代码(如上所示)。我找不到问题所在。当我添加日志时,代码开始工作,但我注意到日志具有不正确的布尔表达式值。最后,我考虑多次记录该表达式,得到上面所示的输出。

我感觉地面不稳--是什么导致了这种情况的发生?一切编译都没有错误,如果我们计算表达式两次,并第二次使用结果,那么它似乎工作得很好。我熟悉可能发生单事件干扰时的投票逻辑(空间辐射命中电路和妥协逻辑),但我不寒而栗地认为这里有必要……

EN

回答 1

Stack Overflow用户

发布于 2013-03-25 12:02:51

什么会导致这种情况发生?

我唯一能想到的就是

  • 正在使用的编译器(标头)和堆栈之间不匹配。
  • 损坏堆栈的信号处理代码

如果您列出的输出总是可重复的,那么第二个原因不可能是它,只剩下第一个原因。

如果您在未优化的代码中观察到这种行为,我将采用的方法是:在GDB中的第一个std::cout << "newDeltaTime > zero_: " <<...行上设置一个断点,并验证在执行该行之后,newDeltaTime不再是0.2。再次重新运行,这一次使用watch *(float*)&newDeltaTime设置一个GDB观察点,并准确地查看值被破坏的位置(可能是libstdc++中的某个地方)。

如果您只在优化代码中观察到这一点,事情就会变得更加棘手,您需要了解ABI和调用约定,然后才能有效地对其进行调试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15607165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档