2012-05-10 13 views
17

IBM AIX xlcコンパイラはローカル変数のストレージを初期化するためのコードを生成フラグを提供しています:私はMSVCコンパイラはデバッグのために似た何かを考えるローカル変数のストレージを初期化するgccフラグはありますか?

 initauto=<hh> 
        Initialialize automatic storage to <hh>. <hh> is a 
        hexadecimal value. This generates extra code and 
        should only be used for error determination. 

ビルドが、私の記憶では、この時点でかすんかもしれません。

GCCの同等のオプションはありますか?

+0

'-Wextra'はすでにコード300万行を持っていない新しいコードベースに最適です。 :) –

+0

私は初期化がコンパイラのドキュメントで "initialialize"と綴られているとは思えません。 –

+0

@AndrewMarshall:ハ!私はそれに気付かなかった。 xlcはかなり古くなっていますが、実際にはそのように綴られています。現在の[オンラインヘルプ](http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Fcompiler%2Fref%2Fruoptini。htm)にはそのエラーはありません。 –

答えて

10

OK、お答えできます。

http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.htmlは、省略して「いいえ」と言います。スタックワイピングコードを出力に注入するためのドキュメントはありません。近私は推測できたとして

は、この仕事ができる唯一の方法は、各埋め込み語彙フレームの先頭に(おそらくわずか mov操作のような単純な、しかしそれにもかかわらず)は、いくつかの memset様コードを挿入することです自動変数が作成されます。 GCCの内部の専門家から farですが、 と書かれているように、と書かれています。

さらに、これに続いて、GCC内部(http://gcc.gnu.org/onlinedocs/gccint.pdf)のPDF gccint.pdfは、関数へのエントリ時のフレームポインタ調整呼び出しステップのGCC名がprologueであることを定義しています。これはマシン定義(md)ファイルで発生するはずなので、そのようなオプションはとなります。を定義する必要があります。 CPUアーキテクチャ。私は彼らのオンラインViewCVSでhttp://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/を突き刺し、機能の拡張のための検索を数回行うとi386.mdの11,893行目にprologue(少なくとも1つ)のコピーが見つかりました。そのような条件付きコードを出力します。

しかし、このアンダーGCC'sフード原料ちょっときれいです...

+0

ありがとう、これは(現在の)正解に最も近いように見えます。 C99の可変長配列、ローカル変数空間の再利用、 'alloca()'のような実際の実装には、間違いなく多くの可能な詳細があります。 –

0

C99:自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不定です。

この質問に関するトピックがあります。 What happens to a declared, uninitialized variable in C? Does it have a value?

+5

言語仕様では、自動保存期間のある変数の初期化が必要ないことを理解しています。しかし、少なくとも1つのコンパイラには、*オプション*が付いています。私の質問は、GCCにも同様のオプションがあるかどうかです。 –

3

GCCの特定のコピー(特にGCC Fortranコンパイラ)には、明示的に初期化されていないローカル変数や配列を自動的に0に設定するオプションがあると思われます(-finit-local-zero)。

これまでのGCCは、このトピックの唯一の特徴は、初期化されていない変数について警告を発するために-Wuninitializedです(これはあなたが探しているものではないことは分かっていますが)。

どれくらいひどく必要ですか?本当に正当な理由がある場合は、-finit-local-zeroコードをご使用のGCCのバージョンにコピーすることは難しくないと思います...

+0

これはちょっとFORTRANのフロントエンドにローカライズされていますが、http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html ...すばらしい見つけることができますが、私は恐れていますCベースのコードの助けを借りて – BRFennPocock

+2

これは現時点では巨大な必要ではありません。この考え方は、xlc(この3百万行のコードベースを持つ)のオプションをオンにしてからgccに移行した場合、gccの対応するオプションなしでは起こり得ない明確な初期化に依存している可能性があります。理想的には、長期的な解決策は '-Werinitalized'を' -Werror'と一緒に使うことです(xlcにも同様のオプションがあります)。 –