1

我找了一段时间,到处都找不到这个。我找到了一个很好的 cppcheck 规则文件示例,它显示了一个简单的模式;

<?xml version="1.0"?>
<rule version="1">
  <pattern>if \( p \) { free \( p \) ; }</pattern>
  <message>
    <id>redundantCondition</id>
    <severity>style</severity>
    <summary>Redundant condition. It is valid to free a NULL pointer.</summary>
  </message>
</rule>

只要所有指针都命名为“p”并且调用是“免费的”,它就可以很好地工作。如何更改“p”以匹配任何标识符?如何检查“'免费'或'删除'”?该模式是 grep/awk/sed 模式吗?

4

3 回答 3

3

我是一名 Cppcheck 开发人员。

Cppcheck 使用PCRE。因此,请使用遵循 Perl 规则的正则表达式。

我不太擅长 Perl 正则表达式,所以我无法回答如何/是否可以匹配任何标识符(因为它应该匹配两次)。

..希望至少有一点帮助。

于 2012-05-31T19:43:53.083 回答
0

根据我的正则表达式经验,我会试试这个

<?xml version="1.0"?>
<rule version="1">
  <pattern>if \( (\w+) \) { free \( \1 \) ; }</pattern>
  <message>
    <id>redundantCondition</id>
    <severity>style</severity>
    <summary>Redundant condition. It is valid to free a NULL pointer.</summary>
  </message>
</rule>

这些 PCRE 功能取代了p您的原始示例:

  • (\w)是一个单词模式(由字母数字字符和'_'组成),在组 #1 中捕获
  • \1是对匹配模式的文本的反向引用

可以在 Martin Moene 的博客中找到详细描述:使用CppCheck查找代码模式

于 2014-06-05T11:35:30.133 回答
0

将 p 更改为 dot(.) 使其表示任何字符

于 2016-07-20T02:32:44.190 回答