通过bash-script

时间:2015-08-20 13:43:07

标签: c++ bash parsing

目前我正在开展一个相当大的项目。为了提高代码质量,我们决定对每个函数强制执行返回值(错误代码)的处理。 GCC支持关于函数返回值的警告,但函数定义必须在以下标志之前。

static __attribute__((warn_unused_result)) ErrorCode test() { /* code goes here */ }

我想实现一个bashscript来解析整个源代码并在发出警告时发出警告

__attribute__((warn_unused_result))

缺少。 请注意,需要此类修改的所有函数都返回一个名为ErrorCode的类型。 你认为这可以通过bash脚本实现吗?

3 个答案:

答案 0 :(得分:5)

也许您可以将sed与正则表达式一起使用。以下是我尝试过的几个测试文件的工作原理:

sed -r "s/ErrorCode\s+\w+\s*(.*)\s*\{/__attribute__((warn_unused_result)) \0/g" test.cpp

如果您不熟悉正则表达式,则该模式基本上转换为:

ErrorCode,一些空格,一些字母数字(函数名称),可能是一些空格,左括号,任何东西(参数),右括号,也许是一些空格,打开大括号。

如果找到此模式,则前缀为__attribute__((warn_unused_result))。请注意,这仅适用于将开放花括号放在与参数相同的行中,并且在函数声明中没有换行符。

答案 1 :(得分:3)

我能想象的一种简单方法是通过ctags。您在所有源代码上创建标记文件,然后解析标记文件。但是,我不太确定标签文件的格式。我在这里使用的变体(Exuberant Ctags 5.8)似乎在第四列中放置了一个“f”,如果标签代表一个函数。所以在这种情况下,我会使用awk来过滤所有代表函数的标记,然后grep抛弃所有不带__attribute__((warn_unused_result))的行。

所以,简而言之,首先你做

$ ctags **/*.c

这会在当前目录中创建一个名为“tags”的文件。该命令也可能是ctags-exuberant,具体取决于您的变体。 **/*.c是一个可以在shell中运行的glob模式 - 如果没有,你必须以另一种方式提供源文件(查看ctags选项)。

然后你过滤了这些功能:

$ cat tags | awk -F '\t' '$4 == "f" {print $0}' | grep -v "__attribute__((warn_unused_result))"

答案 2 :(得分:1)

不,在一般情况下是不可能的。 C ++语法是我所知道的所有语言中最复杂的语法,并且在一般情况下C ++不能通过正则表达式进行解析。如果你将自己局限于一组非常狭窄的用途,你可能会成功,但我不确定你的情况有多可行。 我也不认为excersise是值得的,因为有时忽略函数的结果是一件好事。