Semgrep: Масштабируемый способ отлова всех случаев в многострочных f-строках
В моей базе данных есть несколько журналов, содержащих многострочные f-строки, например:
...
logger.error(
f'...'
f'...'
f'...'
f'...'
f'...'
f'...'
)
У одних есть только два f'...'
на отдельных линиях, у других - 3 f'...'
и так далее.
В настоящее время я дублирую шаблоны, чтобы отловить такие журналы. Например:
...
patterns:
- pattern-either:
- pattern: |
logger.$METHOD(
f'...'
f'...'
f'...'
)
- pattern: |
logger.$METHOD(
f'...'
f'...'
f'...'
f'...'
f'...'
)
Ловите те, у которых 3 и 5 f'...'
в нескольких строках. Я должен написать другой шаблон для тех, у кого 4, 2 и так далее.
Есть ли масштабируемый способ перехватить все это с меньшим количеством шаблонов? Текущая реализация не будет масштабироваться, поскольку могут быть журналы с 6, 7, 8, 9 и так далее многострочными f-строками.
Хорошее решение было опубликовано здесь и живая демонстрация здесь.
По сути, вместо дублирования строк была создана метапеременная $X
для представления сообщения. Если сообщение не соответствует '...'
, оно помечается как подозрительное. Полный код выглядит следующим образом:
rules:
- id: test
patterns:
- pattern-either:
- pattern: logger.$METHOD(..., $X, ...)
- pattern: logger.$METHOD(..., message=$X, ...)
- pattern: logger.$METHOD(..., msg=$X, ...)
- metavariable-pattern:
metavariable: $X
patterns:
- pattern-not: |
"..."
message: Semgrep found a match $X
languages:
- python
severity: WARNING
Все кредиты принадлежат lagoAbal.