代码之家  ›  专栏  ›  技术社区  ›  Waribiki

使用icc时输出不稳定

  •  2
  • Waribiki  · 技术社区  · 13 年前

    我想报告一个有趣的bug。下面的代码应该打印出20倍的“1.0”。相反,当在我的mac上用icc(11.1)编译时(雪豹10.6.8),我得到了不稳定的值(16倍的“0.0”,然后4倍的“1.0.”)。我使用了代码中的几个功能,但似乎没有一个语法不好(编译过程中没有错误,valgrind在运行过程中也没有报告错误)。然而,如果我更改了任何东西(即使是未使用的函数——这就是为什么我觉得它很奇怪),我就会得到正确的输出。使用gcc编译也可以得到正确的输出。

    但我认为最奇怪的是,如果我删除函数“function1”,错误就会消失,尽管代码中没有使用该函数。

    这真的很奇怪,现在我担心我的代码(比它大得多)会不稳定。我需要你的帮助,我真的很困惑。语法上有什么错误吗?

    主要.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;
    }
    

    主.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);
    
    1 回复  |  直到 13 年前
        1
  •  0
  •   Waribiki    13 年前

    在网上挖掘更多信息时,我发现了来自英特尔的以下错误报告:

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

    3) 使用Intel Composer XE。

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

    谢谢