【问题标题】:What is cppcheck rule-file <pattern> syntax?什么是 cppcheck 规则文件 <pattern> 语法?
【发布时间】: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 模式吗?

【问题讨论】:

    标签: regex customization pcre cppcheck


    【解决方案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(.) 表示任意字符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2016-06-23
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多