2

私が持っている興味深いバグを報告したいと思います。以下のコードは、「1.0」を 20 回出力することになっています。代わりに、私の Mac (snow leopard 10.6.8) で icc (11.1) を使用してコンパイルすると、不安定な値 (「0.0」の 16 倍、次に「1.0」の 4 倍) が得られます。コードでいくつかの機能を使用していますが、構文が悪いものはないようです (コンパイル中にエラーは発生せず、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);
4

1 に答える 1

0

Webでさらに掘り下げてみると、Intelからのこのバグレポートが見つかりました。

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

これは、iccコンパイラがcaseステートメントを最適化する方法に関連しているようです。問題を解決するための彼らの提案は次のとおりです。

1)11.1コンパイラでXcode3.2.1を使用します。

2)Xcode 3.2.2、3.2.3、3.2.4でオプション-use-asmを指定して11.1コンパイラを使用します。ほとんどの場合は修正されるはずですが、外部アセンブラを介してオブジェクトファイルを生成しても、L*シンボルがオブジェクトファイルに表示される場合があります。これらのケースは通常、cstringセクションに配置された定数文字列リテラルです。

3)IntelComposerXEを使用します。

私のXcodeはバージョン3.2.6ですが、解決策2)で問題が解決しました。しかし、私はこれについてかなり戸惑い続けています(そしてウェブ上のドキュメントの欠如)。

ありがとう。

于 2012-08-09T11:25:10.920 に答える