1

GNUcflow分析一组 C 源文件并打印一个图表,绘制程序内的控制流程。

我的.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

问题

为什么说“重新定义”?
只能是因为它无法识别typedef struct构造,所以我该如何修复它?

更新

我又跑cflow--debug=1,它给了我这个:

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 ()

正如我们所怀疑的:它没有处理每个 struct 。. . 作为一个结构,即能够在两个不同的结构中具有完全相同的标识符。

那么如何解决这个问题呢?我正在通过电子邮件发送cflow邮件列表。希望很快能收到回复。在那之前,我将尝试使用句法类,看看我是否不能触发正确的行为。

如果我从邮件列表中得到回复,我会发布我自己的答案。

4

1 回答 1

3

这显然是cflow.

我刚刚cflow在我的系统(Ubuntu 17.04)上构建了 1.3、1.4 和 1.5 版本。版本 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支持它们是不合理的——事实上,早期版本可以毫无问题地处理它们。)

作为一种解决方法,请使用cflow1.4。我还建议提交错误报告。这个好像没有报道。(OP 现在已将其报告bug-cflow@gnu.org邮件列表并收到了确认。)

于 2017-12-05T19:54:52.380 回答