Semgrep:如何用可扩展方式捕获代码中所有多行f-string日志?
用Semgrep批量捕获任意数量的多行f-string日志
问题
代码里有多行拼接的f-string日志,格式示例:
logger.error( f'...' f'...' f'...' )
这些日志的f-string片段数量不固定(2个及以上),现在靠重复写pattern-either条目逐个匹配不同数量的片段,没法覆盖6个以上的情况,扩展性极差。
解决办法
用Semgrep的重复表达式匹配能力,只需要一条规则就能捕获所有≥2个片段的多行f-string日志,两种写法可选:
写法一:基于AST变量重复匹配
rules: - id: multi-line-fstring-log pattern: | logger.$METHOD( $FIRST_FSTR $REST_FSTRS ) patterns: - pattern: $FIRST_FSTR = f'...' - pattern: $REST_FSTRS = (f'...' )+ message: "发现多行拼接的f-string日志" severity: INFO
$FIRST_FSTR匹配第一个f-string片段$REST_FSTRS = (f'...' )+匹配后续至少1个片段,组合后总数量≥2,自动覆盖2、3、...N个片段的情况
写法二:结合正则匹配
rules: - id: multi-line-fstring-log pattern: logger.$METHOD($ARGS) pattern-regex: 'f\'.*?\'\s*f\'.*?\'' pattern-inside: | logger.$METHOD( ... ) message: "发现多行拼接的f-string日志" severity: INFO
- 先锁定
logger.$METHOD(...)的多行调用结构 - 用正则
f\'.*?\'\s*f\'.*?\''匹配至少两个连续的f-string(忽略换行和空格)
两种写法都不用再为每个片段数量单独写规则,直接覆盖所有符合要求的多行f-string日志。
内容的提问来源于stack exchange,提问作者Sirjon
相关产品推荐
相关产品推荐

