gnu cflow - 无法识别 "typedef struct"
gnu cflow - not recognizing "typedef struct"
GNU cflow
分析一组 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
邮件列表发送电子邮件。希望很快会收到回复。在那之前,我将尝试使用 syntactic classes 看看我是否无法触发正确的行为。
如果我从邮件列表中得到回复,我将 post 我自己的答案。
这显然是 cflow
中的错误。
我刚刚在我的系统 (Ubuntu 17.04) 上构建了 cflow
版本 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
不支持它们是不合理的——事实上早期版本处理他们没问题。)
作为解决方法,使用 cflow
1.4。我还建议提交错误报告。好像没有报道过这个。 (OP 现在 reported it to the bug-cflow@gnu.org
mailing list and received an acknowledgement。)
GNU cflow
分析一组 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
邮件列表发送电子邮件。希望很快会收到回复。在那之前,我将尝试使用 syntactic classes 看看我是否无法触发正确的行为。
如果我从邮件列表中得到回复,我将 post 我自己的答案。
这显然是 cflow
中的错误。
我刚刚在我的系统 (Ubuntu 17.04) 上构建了 cflow
版本 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
不支持它们是不合理的——事实上早期版本处理他们没问题。)
作为解决方法,使用 cflow
1.4。我还建议提交错误报告。好像没有报道过这个。 (OP 现在 reported it to the bug-cflow@gnu.org
mailing list and received an acknowledgement。)