通过bash-script查找和修改函数定义(C++)

Flo*_*yan 5 c++ bash parsing

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

static __attribute__((warn_unused_result)) ErrorCode test() { /* code goes here */ }
Run Code Online (Sandbox Code Playgroud)

我想实现一个bashscript来解析整个源代码并发出警告,以防万一

__attribute__((warn_unused_result))
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ann 5

也许你可以使用sed正则表达式.以下是我尝试过的几个测试文件的工作原理:

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

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

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

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


Geo*_* P. 3

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

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

$ ctags **/*.c
Run Code Online (Sandbox Code Playgroud)

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

然后你过滤功能:

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