我想报告一个有趣的错误。下面的代码段打印出20次“1.0”。相反,当我在我的mac(雪豹10.6.8)上使用icc(11.1)进行编译时,我得到不稳定的值(16次“0.0”然后4次“1.0”)。我在代码中使用了几个功能,但它们似乎都没有错误的语法(在编译过程中没有错误,并且valgrind在运行期间没有报告错误)。但是,如果我改变任何东西(即使是非使用的功能 - 这就是为什么我觉得它很奇怪),我得到了正确的输出。使用gcc进行编译也可以得到正确的输出。
但我认为最奇怪的是,如果删除函数“function1”,该错误就会消失,尽管代码中没有使用该函数。
这真的很奇怪,现在我担心我的代码(比那个大得多)会不稳定。我需要你的帮助,我真的对此感到困惑。语法有什么问题吗?
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);
答案 0 :(得分:0)
在网上挖掘更多内容时,我发现了英特尔的这个错误报告:
它似乎与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)使用Intel Composer XE。
我的Xcode是版本3.2.6,但解决方案2)解决了我的问题。然而,我仍然对此感到困惑(并且缺乏网络上的文档)。
感谢。