【问题标题】:Unstable output when using icc使用icc时输出不稳定
【发布时间】:2012-08-06 07:15:32
【问题描述】:

我想报告我遇到的一个有趣的错误。下面的代码应该打印出 20 次“1.0”。相反,在我的 mac(雪豹 10.6.8)上使用 icc (11.1) 编译时,我得到不稳定的值(16 倍“0.0”然后 4 倍“1.0”)。我在代码中使用了几个特性,但它们似乎都没有语法错误(编译期间没有错误,并且 valgrind 在运行期间没有报告错误)。但是,如果我更改任何内容(即使是未使用的功能 - 这就是为什么我觉得它很奇怪),我会得到正确的输出。用 gcc 编译也能得到正确的输出。

但我觉得最奇怪的是,如果我删除函数“function1”,bug就消失了,虽然代码中没有用到这个函数。

这真的很奇怪,现在我担心我的代码(比这大得多)会不稳定。我需要你的帮助,我对此感到非常困惑。语法有什么问题吗?

main.c:

#include "main.h"

 int main(argc,argv)
 int argc;
 char **argv;
{

  Config para;
  para.option1 = ONE;

  para.a[0] = 0.0;
  para.a[1] = 0.0;
  para.a[2] = 0.0;
  para.a[3] = 1.0;

  int i;  
  double *x = (double *)malloc(20*sizeof(double));
  for(i=0;i<20;i++) x[i] = 1.0;
  for(i=0;i<20;i++) printf("%f \n", x[i]);
  free(x);

  function2(para);

  return EXIT_SUCCESS;
}

void function1(int option){

  switch(option){
  case ONE: case TWO: case THREE: case MONE:
    printf("MONE to THREE\n");
    break;
  case FOUR:
    printf("FOUR\n");
    break;
  }

  return;
}

void function2(const Config para){

  if(para.option1 == FOUR){
    printf("FOUR\n");
  }

  return;
}

main.h:

#include <string.h>
#include <stdio.h>
#include <stddef.h>
#include <math.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <stdarg.h>

#define MONE    -1
#define ONE      1
#define TWO      2
#define THREE    3
#define FOUR     4

typedef struct Config
{
  int option1, option2;
  double a[4];
} Config;

void function1(int option);
void function2(const Config para);

【问题讨论】:

  • 只是出于兴趣,您为什么选择 main 已弃用的 K&R 样式函数定义而不选择其他函数?
  • 您应该查看包含和不包含 function1 的生成的 asm,和/或使用调试器逐步执行程序。
  • 嗨,吉姆,谢谢。我应该使用什么调试器? Valgrind 没有给出任何错误...
  • 您使用哪个优化级别进行编译?我偶然发现了由-O3 触发但被-O2 触发的 GCC 错误...
  • 嗨,HonkyTonk,谢谢。不同级别的优化不会改变任何事情。

标签: c osx-snow-leopard valgrind icc


【解决方案1】:

在网上挖掘更多内容时,我发现了英特尔的这个错误报告:

http://software.intel.com/en-us/articles/intel-compiler-and-xcode-322-linker-runtime-crash-with-switch-statement/

这似乎与icc编译器如何优化case语句有关。他们解决问题的建议如下:

1) 使用 Xcode 3.2.1 和 11.1 编译器。

2) 在 Xcode 3.2.2、3.2.3、3.2.4 中使用带有选项 -use-asm 的 11.1 编译器。 它应该可以解决大多数情况,但在某些情况下,即使通过外部汇编程序生成目标文件 L* 符号仍然可能出现在目标文件中。这些情况通常是放置在 cstring 部分中的常量字符串文字

3) 使用英特尔 Composer XE。

我的 Xcode 是 3.2.6 版,但解决方案 2) 解决了我的问题。然而,我仍然对此感到非常困惑(以及网络上缺乏文档)。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-08
    • 2012-01-08
    • 2022-12-17
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多