【问题标题】:Crazy behavior when using compiler optimization使用编译器优化时的疯狂行为
【发布时间】:2016-11-30 09:30:55
【问题描述】:

以下代码的执行运行到“!!!”编译器优化时:

int test()
{
  volatile uint32_t flag = 0; /* volatile doesnt matter */

  flag = 3;
  if (flag == 0 ) 
  {
      return 0; // !!!
  }
  else
  {
      return 1;
  }
}

编译器:IAR Studio C 编译器;平台:SAM4C微控制器;中级优化

当然,这已经是一段代码了,原来的问题已经归结于此。

我无法理解编译器在这里做什么......

另一方面,这按预期工作:

int test()
{
  volatile uint32_t flag = 0; /* volatile doesnt matter */
  int result = 0;

  flag = 3;
  if (flag == 0 ) 
  {
      result = 0; 
  }
  else
  {
      result = 1; // !!!
  }
  return result;
}

【问题讨论】:

  • 看起来很神秘,asm里有什么线索吗?

标签: compiler-optimization


【解决方案1】:

我花了一些时间观察到,该函数确实返回 1,尽管调试器在“return 0;”行停止。

我遇到的问题与未初始化的变量(函数外部)有关,该变量在优化期间不会自动设置为零。

除了调试器中的奇怪行为之外,该功能是正确的。不幸的是,观察结果导致了误解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多