ソースコード内で可変数の引数をとる関数を呼び出すとします。私は実際に関数に渡されている引数の型を見つけるために、このソースコードで何らかの静的解析を行いたいと思っています。例えば、私の関数呼び出しがある場合 -関数の引数型を取得する
のfoo(a、b、c)は、
私は、B、Cのデータ型を見つけ、この情報を保存します。
ソースコード内で可変数の引数をとる関数を呼び出すとします。私は実際に関数に渡されている引数の型を見つけるために、このソースコードで何らかの静的解析を行いたいと思っています。例えば、私の関数呼び出しがある場合 -関数の引数型を取得する
のfoo(a、b、c)は、
私は、B、Cのデータ型を見つけ、この情報を保存します。
これはC++である場合は、型IDを使用して一緒にいくつかのRTTIをハックすることができますなど
私のひざの痙攣は、「C言語でC++に言及した人は誰もが、言語が質問の一部ではなく補足として追加されたかどうかを確認するのに十分長い間、 –
あなたはかなりよく構文解析とビルド・シンボル・テーブルにコンパイルの一部を行う必要がありますプログラム。
これは、プリプロセッサを実行し、レキシングすることを意味します。
これは悪いニュースです。
いいえ、は大変なことをしなければならないということです。 AST、typedefを除くコードのすべての部分を構築する必要はありません。構造体、共用体、および列挙型の定義。変数または関数の宣言および定義。関数呼び出しの引数を分析することはノーオペレーションである可能性があります。
クリスのコメントのメッセージがさらに表示されます:式の種類を分析してva-argのプロモーションも処理できるようにする必要があります。
これはまだコンパイラ全体を書くよりも小さなプロジェクトですが、何らかの考えによってアプローチする必要があります。
あなたは定義を必要としません - 'struct'宣言だけで十分です。定義を破棄することができます。 –
@Chris、 'foo(bar.i)'のような呼び出しがない限り、いいえ? – dmckee
また、特にvariadic関数からのプロモーションの後では、リテラルの種類について本当に注意する必要があります。そして、あなたはほとんどの表現を解析する必要があると思います。 –
どの言語? – dutt
あなたの関数が 'printf'や' scanf'のような変種であれば、コードはC – i0exception
FWIWです。gccを使っているなら、['format'関数属性](http:// gcc。 gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bformat_007d-function-attribute-2417)をコンパイルすると、コンパイラは自動的にその関数のすべての呼び出しに引数をタイプ・チェックします。 –