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.

Вернуться на верх