我想知道面对 C/C++ 代码中的 ifdefs,如何计算标准代码复杂度指标(例如 LOC、McCabe 圈复杂度、Halstead 指标等)。
如果忽略 ifdefs,可能会出现语法错误(甚至类型错误),例如:
- #ifdef FOO
- for(i = 0; i < x; i++) {
- #别的
- for(i = 0; i < y; i++) {
- #万一
- 打印(...)
- }
如果忽略第 1、3 和 5 行,则生成的代码将在另一个循环中包含一个循环,并且缺少“}”(因此出现语法错误)。
如果考虑到#ifdefs,那么每个变体都需要一个结果度量(在这种情况下,一个定义 FOO 的情况,另一个用于未定义 FOO 的情况)。然而,这种方法在实践中很容易爆炸。
查看http://manpages.ubuntu.com/manpages/natty/man1/pmccabe.1.html,手册页报告说:
解析 pmccabe 会忽略所有 cpp 预处理器指令 - 计算代码外观的复杂性,而不是预处理器破坏代码后的复杂性。这一点尤其重要,因为像 getchar(3) 这样简单的东西会扩展成增加复杂性的宏。
但是,正如我所说,这种方法可能会导致出现代码错误,进而可能会阻碍计算过程或导致错误的值。
工具如何克服这个问题(如果它们完全克服的话)?
问候。