2017-12-05 26 views
0

GNU cflowは、Cソースファイルの集まりを分析し、プログラム内で制御フローをグラフ化してグラフを出力します。gnu cflow - "typedef struct"を認識しない

マイ.cまたは.cppファイル

typedef struct _type_1{ 
    int a; 
} type_1_t; 


typedef struct _type_2{ 
    int a; 
} type_2_t; 

int main() 
{ 
    type_1_t t1; 
    type_2_t t2; 

    t1.a = 55; 
    t2.a = 99; 

    return 0; 
} 

コマンドがcflow.exe test.c -i s -i x > test.graph 2>&1で、出力は次のとおりです。

cflow.exe:test.c:7: a redefined 
cflow.exe:test.c:2: this is the place of previous definition 
main() <int main() at test.c:11>: 
    type_1_t <type_1_t at test.c:3> 
    t1 
    type_2_t <type_2_t at test.c:8> 
    t2 

QUESTION

なぜそれが "を再定義" と言っていますか?
typedef struct構造を認識できないためにのみ問題があります。どうすれば修正できますか?

UPDATE

私は--debug=1で再びcflowを実行し、それが私にこの与えた:私たちは疑いのと同じように

test.c:3: type _type_1 
test.c:3: a/-1 defined to int a 
test.c:3: type_1_t/-1 defined to type_1_t 
test.c:8: type _type_2 
cflow.exe:test.c:7: a redefined 
cflow.exe:test.c:2: this is the place of previous definition 
main() <int main() at test.c:15>: 
    type_1_t <type_1_t at test.c:3> 
    t1 
    type_2_t <type_2_t at test.c:8> 
    t2 
    f1() <int f1() at test.c:10> 
test.c:8: a/-1 defined to int a 
test.c:8: type_2_t/-1 defined to type_2_t 
test.c:11: f1/0 defined to int f1() 
test.c:16: main/0 defined to int main() 

を:それは、各構造体を処理することはありません。 。 。構造体、すなわち、2つの異なる構造体に全く同じ識別子を持つことができます。

これを修正するにはどうすればよいですか?私はcflowメーリングリストにメールを送っています。すぐに聞いてくれることを願っています。それまでは、私はsyntactic classesで遊んで、正しい動作を引き起こすことができないかどうかを確認します。

メーリングリストから回答が返ってきたら私自身の回答を投稿します。

+0

4386427 @私は' cflow'は、それが再定義されているだと思った理由を知っています。 – Adrian

+1

あなたは結論に飛びついていると思います。私はなぜ 'cflow'が' a'が再定義されたと言っているのか分からないが、普及しているツールが何十年もの間スタンダードCにあった機能を理解することはできないだろう。私はUbuntu上でcflow 1.4を使用してそのエラーを取得しません。 'cflow --version'は何を出力しますか? –

+0

@KeithThompson私はWindows上で 'cflow' 1.5を使用しています。 1.4で試してみます。また、Linuxでは、[環境変数と.cflowrc](https://www.gnu.org/software/cflow/manual/cflow.html#Configuration)から設定値を読み込みます。だから、 'cflow'に' typedef struct'を解析する方法を伝えるいくつかの設定オプションであなたが読み込んでいるかもしれません。私は1.4をビルドして戻ってくる – Adrian

答えて

3

これは明らかにcflowのバグです。

私のシステム(Ubuntu 17.04)には、バージョン1.3、1.4、1.5のバージョンcflowがインストールされました。バージョン1.3と1.4では、あなたが記述した問題は発生しません。バージョン1.5はそうです。ここで

は、問題を示す単純なテストケースです:

$ cat c.c 
typedef struct type1 { int a; } type1; 
typedef struct type2 { int a; } type2; 
$ cflow --version | head -n 1 
cflow (GNU cflow) 1.5 
$ cflow c.c 
cflow:c.c:2: a redefined 
cflow:c.c:1: this is the place of previous definition 
$ 

(異なる構造タイプのためtypedef struct、別の名前空間を約三十年のためのCの機能となっていることがcflowがそれらをサポートするために失敗することをもっともらしくありません。実際には以前のバージョンで問題なく処理されています)。

回避方法として、cflow 1.4を使用してください。バグレポートを提出することもお勧めします。これは報告されていないようです。それは `のtypedef struct`の構造を理解していない:(。OPは今reported it[email protected]メーリングリストを持っており、acknowledgementを受けた)

+0

好きな人は、自分でバグレポートを提出できます。 –

+0

私はそれをやった。残念ながら、バージョン '1.4'は' -i x'を使うときにシンボルを出力しませんが、他の動作よりも好ましいでしょう。 – Adrian

+0

@Adrian:[Bugzilla]ページ(https://savannah.gnu.org/bugs/?group=cflow)には表示されません。 –

関連する問題