(low) check-no-print.py/PRINT_RE: ловит закомментированный print, строковые литералы и method-call .print() — ложные блокировки #1497

Closed
opened 2026-06-15 05:58:45 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: logic · Файл: scripts/claude-hooks/check-no-print.py:32, 73-77

check-no-print.py:32, 73-77 — регэксп (?<!\w)print\s*( применяется к каждой строке new_string/content без учёта синтаксиса. Эмпирически матчатся '# print(debug)', 'x = "print("', 'self.print(', 'logger.print(' — это не builtin print, но строка 76 находит match и хук возвращает exit 2 (строка 90), блокируя Edit/Write. Lookbehind (?<!\w) отсекает только предшествующий word-char, но не '.', '#', кавычку. Импакт: ложные срабатывания, автор вынужден добавлять '# noqa' там, где настоящего print нет (низкий). Чинить: как минимум добавить в lookbehind точку — (?<![\w.]) — чтобы не ловить method-call; в идеале игнорировать строки-комментарии и парсить через ast/tokenize вместо regex по сырой строке.

Почему баг: (?<!\w) исключает только случай, когда перед 'print' стоит буквенно-цифровой символ; точка ('.') и начало комментария/строки им не являются, поэтому 'self.print(' и '# print(' матчатся. Проверено эмпирически: '# print(debug)', 'x = 'print('', 'self.print(', 'logger.print(' — все дают match. Хук позиционируется как «blocks new print( calls», но на деле даёт ложные срабатывания на не-builtin конструкциях и блокирует корректные изменения.

Как чинить: Парсить через ast/tokenize и флагать только реальные вызовы builtin print (ast.Call с func=ast.Name(id='print')), либо как минимум игнорировать строки, начинающиеся с '#', и исключать вызовы вида '.print('. Регэксп по сырому тексту для этой задачи недостаточен.


deep-audit «армия ботов 2» · verify+harden, confidence 0.92 · unit U112

**Severity:** low · **Категория:** logic · **Файл:** `scripts/claude-hooks/check-no-print.py:32, 73-77` check-no-print.py:32, 73-77 — регэксп (?<!\w)print\s*\( применяется к каждой строке new_string/content без учёта синтаксиса. Эмпирически матчатся '# print(debug)', 'x = "print("', 'self.print(', 'logger.print(' — это не builtin print, но строка 76 находит match и хук возвращает exit 2 (строка 90), блокируя Edit/Write. Lookbehind (?<!\w) отсекает только предшествующий word-char, но не '.', '#', кавычку. Импакт: ложные срабатывания, автор вынужден добавлять '# noqa' там, где настоящего print нет (низкий). Чинить: как минимум добавить в lookbehind точку — (?<![\w.]) — чтобы не ловить method-call; в идеале игнорировать строки-комментарии и парсить через ast/tokenize вместо regex по сырой строке. **Почему баг:** (?<!\w) исключает только случай, когда перед 'print' стоит буквенно-цифровой символ; точка ('.') и начало комментария/строки им не являются, поэтому 'self.print(' и '# print(' матчатся. Проверено эмпирически: '# print(debug)', 'x = \'print(\'', 'self.print(', 'logger.print(' — все дают match. Хук позиционируется как «blocks new print( calls», но на деле даёт ложные срабатывания на не-builtin конструкциях и блокирует корректные изменения. **Как чинить:** Парсить через ast/tokenize и флагать только реальные вызовы builtin print (ast.Call с func=ast.Name(id='print')), либо как минимум игнорировать строки, начинающиеся с '#', и исключать вызовы вида '.print('. Регэксп по сырому тексту для этой задачи недостаточен. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.92 · unit U112</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:58:45 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:14 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1497
No description provided.