什么是 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> 语法?的主要内容,如果未能解决你的问题,请参考以下文章