2011-08-04 6 views
2

自分のシステムにframa-cをインストールしました。それは、それはCのすべての暗黙的な変換をより拡張された形式にすべての私のコードを変換しない何オブジェクトコードを作成する前にコンパイラが暗黙的に変換したコードを生成するかどうか

..

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

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

// FRAMA-cは今、私の疑問は、オブジェクトPROGを作成する前に あるコード

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); 
     } 
     } 
    } 
    } 

を変換しましたram、Cコンパイラはすべて暗黙の変換を行うかどうか?

OR

かどうか、オブジェクトプログラムの作成時に、これらの暗黙的な変換は平行で行われますか?

OR

それは実装に依存しているのですか?もしそうなら、なぜですか?

答えて

1

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

通常、Cコンパイラはこの種のソース変換を実行しません。

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

簡単な例を取るために、この:

int n = 42; 
double x = n; 

xの初期化に倍増するint型からの暗黙的な変換を実行しますが、おそらくコンパイル処理で何も

のように見えるテキストを作成するつもりはありません
double x = (double)n; 

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

+0

私はあなたの説明がとても好きです。ただ明確にするために、Frama-Cは、コンパイラが行う以外に、テキストでメモリ上に 'double x =(double)n; 'を持たない。抽象構文木では、変換が明示的に行われます(標準では、 'x = n;'が意味するので、ほとんどのコンパイラがそうするでしょう)。 ASTがきれいに印刷されていることを要求した場合(例えば、デバッグの助けとして)、変換はテキストでのみ表示されます。 Thompson偉大な答えを@keith –

+0

。ありがとうございました –

2

printfの最初の引数の型はconst char*なので、printfを使用する前に<stdio.h>を含めると、変換は暗黙的にコンパイラによって実行されます。 (つまり、この場合はキャストする必要はありません)

+0

ya変換は暗黙的です。そして、疑問は、オブジェクトプログラムを作成する前に暗黙的に変換されたコードをコンパイラが生成するかどうか、または暗黙の変換操作を行ごとに(各行のオブジェクトコード作成中に)行います。 –

+0

@EAGER_STUDENT :私はあなたが何を意味するのかは分かりませんが、コンパイラが変換を実行する方法はその選択です。 C標準は、結果として生じる*動作*を保証するだけです。いずれにせよ、 'const'修飾子の追加は、コンパイル時の構造であるため、異なるオブジェクトコードを生成する可能性はほとんどありません。 –

1

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

あなたが見ているのは、実際には、コンパイル可能なCコードである抽象構文木のテキスト表現です。気付いたとおり、多くのコンバージョンが明示されます。私たちが知っている限り、バグの可能性については、これらの変換を追加しても、コンパイラがC99標準の6.3節(特に6.3。 1.8「通常の算術変換」)。

かなり印刷されたコードをコンパイルすると元のものとは異なる結果が得られた場合、これはthe Frama-C bug trackerで報告できるバグです。

関連する問題