2

システムにframa-cをインストールしました。

それが何をするか、それはすべての私のコードをCのすべての暗黙の変換でより拡張された形式に変換します。

(例)
//私の実際のコード

 if(opTab ==NULL || symTab ==NULL || intermediateFile==NULL || sourceCode ==NULL)
 {
   printf("\nError in opening file streams");
   exit(EXIT_FAILURE);
 }

//Frama-c変換されたコード

 if (opTab == (void *)0) {
    printf((char const   *)"\nError in opening file streams");
    exit(1);
  }
  else {
    if (symTab == (void *)0) {
      printf((char const   *)"\nError in opening file streams");
      exit(1);
    }
    else {
      if (intermediateFile == (void *)0) {
        printf((char const   *)"\nError in opening file streams");
        exit(1);
      }
      else {
        if (sourceCode == (void *)0) {
          printf((char const   *)"\nError in opening file streams");
          exit(1);
        }
      }
    }
  }

今私の疑問は、 オブジェクトプログラムを作成する前に、Cコンパイラがすべての暗黙的な変換を行うかどうかです。

また

オブジェクトプログラムの作成中に、これらの暗黙の変換が並行して行われるかどうか

また

実装に依存しますか?もしそうなら、なぜですか?

4

3 に答える 3

1

ほとんどの場合、そうではありません。私は frama-c には詳しくありませんが、あなたが見ている変換はソースからソースへの変換です。つまり、C ソースを入力として受け取り、修正された C ソースを出力として提供します。どうやらその仕事は、コードをより明示的かつ冗長にすることです。

通常、AC コンパイラはそのようなソース変換を実行しません。(まあ、プリプロセッサはそうしますが、それは異なります。)

必要な変換を実行するコードを生成しますが、機械語、アセンブリ言語、または何らかの中間形式のいずれかの形式で変換を行います。

簡単な例を挙げると、次のようになります。

int n = 42;
double x = n;

の初期化時に int から double への暗黙的な変換を実行しますがx、おそらくコンパイル プロセスでは次のようなテキストは作成されません。

double x = (double)n;

C コンパイラは、C ソース コードを入力として受け取ります。通常、出力として生成しません。理論上は可能ですが、そうする理由はありません。

于 2011-08-04T20:54:26.767 に答える
1

私は Frama-C 開発者の 1 人です。

表示されているのは、たまたまコンパイル可能な C コードである抽象構文ツリーのテキスト表現です。お気づきのとおり、多くの変換が明示的に行われています。私たちが知る限り、またバグが入り込む可能性があるとしても、これらの変換を追加してもプログラムの意味は変わりません。これらの変換は、C99 標準のセクション 6.3 (特に 6.3. 1.8「通常の算術変換」)。

プリティ プリントされたコードをコンパイルすると、元のコードとは異なる結果が得られる場合、これはFrama-C バグ トラッカー で報告できるバグです。

于 2011-08-04T22:37:24.997 に答える