如何修正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
相关产品推荐
相关产品推荐

