什么是 cppcheck 规则文件 <pattern> 语法?

Posted

技术标签:

【中文标题】什么是 cppcheck 规则文件 <pattern> 语法?【英文标题】:What is cppcheck rule-file <pattern> syntax? 【发布时间】:2012-05-31 15:38:21 【问题描述】:

我已经四处寻找了一段时间,但在任何地方都找不到。我找到了一个很好的 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 模式吗?

【问题讨论】:

【参考方案1】:

我是一名 Cppcheck 开发人员。

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

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

.. 希望至少能有所帮助。

【讨论】:

继续提问。我有一个单行文件; foo = (char*)logMsg.c_str() 并使用 '--rule=".+"' 找出解析为 'foo = logMsg 的内容。 c_str()'。 '(char *)' 演员表发生了什么?我将如何在规则文件中测试该演员表? 内部存在“未简化”代码,其中保留了强制转换,但无法从规则访问此内部“未简化”代码。我想我们可以在规则文件中添加一个属性或其他内容,请求使用“未简化”代码。如果需要,请随时在 Cppcheck trac 中开票。 @DanielMarjamäki suggestion I just posted 的任何 cmet - 是从你的 POV 获得的吗?【参考方案2】:

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

<?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 的博客中找到:Find code patterns with CppCheck

【讨论】:

【参考方案3】:

把 p 改成 dot(.) 表示任意字符

【讨论】:

以上是关于什么是 cppcheck 规则文件 <pattern> 语法?的主要内容,如果未能解决你的问题,请参考以下文章

要构建以提供给 cppcheck MISRA 附加组件的正确规则文件是啥?

CppCheck 规则不显示#define,注释

cppcheck 生成 xml 转储文件

Cppcheck:所有功能的检查注释的自定义规则

自定义 cppcheck 规则集

如何告诉 cppcheck 忽略某些错误?