You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正Semgrep规则以精准识别未加m_前缀的C++类成员变量

Semgrep规则修正:避免误匹配C++类成员变量与函数

问题场景

需要编写Semgrep规则,识别C++类中未以m_为前缀的成员变量,但初始规则会错误匹配类中的函数声明。

初始规则(存在误匹配)

rules:
  - id: find-includes
    languages:
      - c++
    severity: ERROR
    message: Include detected {$A}
    patterns:
      - pattern-inside: >
          class $X {
          };
      - pattern-not: $TYPE $A(...) const;
      - pattern: $TYPE $A;
      - metavariable-regex:
          metavariable: $A
          regex: ^[^m][^_].*$

测试代码

class Foo {
    int myvar;
    int myblank() const;
};

上述规则会同时匹配myvar(目标成员变量)和myblank()(函数),不符合预期。

修正后的规则

rules:
  - id: find-includes
    languages:
      - c++
    severity: ERROR
    message: Include detected {$A}
    patterns:
      - pattern-inside: >
          class $X {
          };
      - pattern-either:
          - pattern: $TYPE $NAME;
          - pattern: $TYPE $NAME = $VAL;
      - pattern-not: $RETURNTYPE $FUNC(...);
      - metavariable-regex:
          metavariable: $NAME
          regex: ^[^m][^_]?.*$

修正要点

  • 精准锁定成员变量结构:用pattern-either明确匹配两种成员变量定义形式——普通声明和带初始化值的声明,避免模糊匹配
  • 全面排除函数:使用pattern-not: $RETURNTYPE $FUNC(...)排除所有函数声明(无需单独限定const,覆盖所有函数形式)
  • 优化正则匹配:将正则调整为^[^m][^_]?.*$,覆盖更全面的非m_前缀场景(比如单个字符开头的变量名)

内容的提问来源于stack exchange,提问作者Jimbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:22:36