Быстрая справка для ежедневного использования.
# Поиск секретов
rg "(?i)(password|secret|api_key|token|private_key).*=.*['\"]" --type rust
# Поиск SQL инъекций
rg "format!.*SELECT|execute.*&format!" --type rust
# Поиск command инъекций
rg "Command::new.*format!" --type rustЧек-лист:
- Нет hardcoded credentials
- SQL запросы параметризованы
- Валидация всех входных данных
- auth_date проверяется для защиты от replay attacks
- Нет слабых алгоритмов (MD5, SHA1)
# Найти все unwrap/expect/panic
rg "\.unwrap\(\)|\.expect\(|panic!" --type rust --glob '!tests'Правило: Нет panic в production коде (только Result).
// ❌ Длинные цепочки
let value = parse(input).map_err(E::A)?.validate().map_err(E::B)?;
// ✅ Читаемый код
let Ok(value) = parse(input) else { return Err(E::A); };
let Ok(value) = value.validate() else { return Err(E::B); };Правило: let-else для нескольких шагов, map_err — для одного.
# Вложенные циклы (потенциальный O(n²))
rg "for.*\{[\s\S]{1,200}for" --type rust
# Vec::new без with_capacity
rg "Vec::new\(\)" --type rust
# contains в цикле
rg "\.contains\(" --type rust
# Лишние clone
rg "\.clone\(\)" --type rustВопросы:
- Парсинг происходит один раз?
- Используется with_capacity для Vec?
- Нет O(n²) где можно O(n)?
- Используются итераторы вместо промежуточных Vec?
- Нет секретов в коде
- Нет unwrap/expect
- Входные данные валидируются
- Нет SQL/Command инъекций
- Нет очевидных O(n²)
- Нет дублирования операций
- Vec::with_capacity где нужно
- Нет дублирования кода (> 3 раз)
- Функции < 50 строк
- Нормальные имена переменных
- Есть тесты на новую логику
// ❌ ПЛОХО
fn validate(raw: &str, hash: &str) -> bool {
compute_hash(raw) == hash // Нет проверки времени!
}
// ✅ ХОРОШО
fn validate(raw: &str, hash: &str, max_age: u64) -> bool {
check_timestamp(raw, max_age) && compute_hash(raw) == hash
}// ❌ ПЛОХО - парсим дважды
fn validate(raw: &str) -> bool {
let data = parse(raw); // 1
check(data);
hash(raw) // parse() вызывается внутри снова! 2
}
// ✅ ХОРОШО
fn validate(raw: &str) -> bool {
let data = parse(raw); // 1 раз
check(&data);
hash(&data) // передаем ссылку
}// ❌ ПЛОХО
for id in ids {
let user = db.get(id).await; // N запросов
}
// ✅ ХОРОШО
let users = db.get_many(ids).await; // 1 запрос// ❌ ПЛОХО
fn process(data: Vec<String>) -> usize {
data.len() // Забирает ownership зря
}
// ✅ ХОРОШО
fn process(data: &[String]) -> usize {
data.len()
}# Все unwrap/expect
rg "\.unwrap\(\)|\.expect\(" --type rust --glob '!tests'
# Magic numbers
rg "\b[0-9]{3,}\b" --type rust
# TODO/FIXME
rg "TODO|FIXME" --type rust
# Длинные функции (>50 строк)
# (нужен скрипт или ручная проверка)# Покрытие тестами
cargo tarpaulin --out Xml
# Clippy
cargo clippy -- -D warnings
# Форматирование
cargo +nightly fmt --check
# Тесты
cargo test
# Бенчмарки
cargo bench- Уязвимости безопасности
- Panic в production
- Логические ошибки
- Сломанные тесты
- Проблемы производительности (>10% деградация)
- Дублирование кода (>3 раз)
- Отсутствие тестов для критичной логики
- Рефакторинг для читаемости
- Дополнительные тесты
- Улучшение документации
- "Это плохо"
- "Переделай"
- "Тут проблема"
- "Здесь возможна SQL-инъекция в строке 42. Используй параметризованный запрос:
query_as!(...)" - "Эта функция вызывается в цикле, что дает O(n²). Можно использовать HashMap для O(n)"
- "Нет проверки auth_date - уязвимость к replay attack. Добавь валидацию времени по документации Telegram"
Формула:
- Что не так
- Почему это проблема
- Как исправить (или предложить варианты)
- Безопасность
- Panic/unwrap
- Очевидные баги
- Дублирование операций
- Неэффективные алгоритмы
- Лишние аллокации
- Дублирование кода
- Читаемость
- Тесты
- Документация
- Архитектура
- Edge cases в тестах
- Долгосрочная поддерживаемость
## Security
- [ ] auth_date validation missing (replay attack) - line 42
- [ ] SQL injection in `get_user()` - line 156
## Performance
- [ ] Double parsing of initData - lines 50, 75
- [ ] O(n²) in `remove_duplicates()` - line 200
## Quality
- [ ] Hash computation duplicated 3 times - suggest extract function
- [ ] Missing tests for error cases
## Suggestions
- Consider using HashMap instead of Vec::find for O(1) lookups
- Add doc comments for public API- Открой PR → смотри diff
- Безопасность (5 мин):
rgсекреты, unwrap, инъекции
- Производительность (5 мин):
- Дублирование, O(n²), аллокации
- Качество (5 мин):
- DRY, читаемость, тесты
- Пиши комментарии - конкретно и с решениями
- Approve или Request Changes
Итого: 15-20 минут на обычный PR
Подробности смотри в: