计算SLOC的GCC C/C++ Linux

4
我们有一个相当大的(280个二进制文件)Linux软件项目,目前它的代码结构非常分散 - 这意味着无法确定源代码树中哪些代码是有效的(可生成可部署的二进制文件),哪些已经废弃。但是Makefiles很好用。我们需要计算整个项目的C/C++ SLOC。
这里有一个问题 - 我能找出GCC编译的SLOC吗?或者我可以从二进制文件(可能是调试信息)中获取此信息吗?或者我可以找出二进制文件是从哪些源文件编译而来,并使用此信息计算SLOC?
谢谢 Bogdan

SLOC == "标准代码行数"或者类似的东西吗? - dmckee --- ex-moderator kitten
1
可能是“源代码行数”的缩写。这不是一个非常有用的指标,但有时其他人需要它。 - David Thornley
是的,我指的是源代码行数 - 我们需要这个来计算应用程序的哪一部分被测试覆盖了。我们有280个组件中的几个已经被覆盖了,需要知道这相对于整个项目的比例是多少。 - Bogdan
6个回答

2
这取决于您所说的GCC编译的SLOC是什么意思。如果您的意思是跟踪GCC使用的项目源文件,那么您可能会使用依赖项跟踪选项来列出源文件和头文件。这就是-M和各种相关选项。请注意不要包括系统提供的标头。我有时使用的一种技术是用适当的变化替换标准C编译器 - 例如,为确保64位编译,我使用“CC =” gcc-m64“”,以确保使用C编译器时,它将以64位模式编译。显然,有了文件列表,您可以使用“wc”来计算行数。您可以使用“sort -u”来消除重复的标题。
一个明显的陷阱是,如果您发现所有内容都包含相对路径名 - 那么您必须更仔细地确定每个文件的位置。
如果您有其他关于SLOC的定义,则需要说明您心中所想的是什么。有时,人们正在寻找非空白,非注释的SLOC,例如-但您仍然需要源文件列表,我认为“-M”选项将帮助您确定。

嗨,我在小的“hello world”上尝试了这种方法,似乎很有效。它会产生许多包含iostream头文件的头文件,但是它们都可以通过/usr前缀削减掉。虽然在项目中应用这种方法很困难 - 我需要修补整个makefile,但这是一个好建议。谢谢。 - Bogdan
@Bogdan - 或许需要的一个变化是允许对Makefile进行集中式更改,例如使用'include ${TOPDIR}/config/configuration.mk',这个Makefile定义了项目的全局选项等。我的Makefile通常将UFLAGS保留为用户在命令行上输入的选项,作为CFLAGS的子选项。 - Jonathan Leffler

1

1
你可以使用gcc的-E标志进行预处理器编译,这将导致实际编译的代码输出。可以进行简单的行计数(wc -l)或更高级的操作。
它可能包括来自宏等的额外代码,但特别是如果与先前代码的实例进行比较,则是一个很好的比较。

我在一个小的“hello world” .cpp 上尝试了这种方法。执行 gcc -E a.cpp | wc -l 后,我得到了 29494 行。其中大多数是 iostream 的内部内容,要摆脱这些代码将是一项艰巨的工作。谢谢您的答复。我相信如果您使用比较(diff)软件,它会很有用。 - Bogdan

1

首先,你需要一个准确的编译列表。你可以使用包装脚本代替gcc来实现这一点。

第二个列表是你想要用于此的文件列表。为此,请查阅依赖项列表(因为你说那是正确的)。 (似乎你需要使用make --print-data-base)

然后,对文件列表进行排序和去重,并且删除系统头文件。对于每个剩余的文件,使用你喜欢的工具确定SLOC计数。


嗨,用替换原始gcc的假gcc来获取编译哪些文件似乎是最有效的方法。尽管我必须自己管理包含的.h文件,但这需要最少的时间来实现,是最有效的方法。我将使用它来获取精确的度量指标。谢谢。 - Bogdan

0
我用了以下方法在2小时内获取了脏指标值。尽管精确度远非理想,但已足以做出决策。
我们取了约40kb的代码,并使用gcov计算了该代码的SLOC。然后,我们计算了“每字节源代码行数”指标,并使用它来获取整个项目的C源代码大小的近似SLOC数。
对于我们的需求来说,这个方法完全可行。
谢谢。

0
您可能想尝试使用资源标准度量来计算有效代码行数,它会排除程序员风格的独立大括号等内容,这会人为地将SLOC计数增加10%到33%。您可以向他们索取一个免费的时限许可证来试用该工具。
他们的网页是 http://msquaredtechnologies.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接