harness-writing — скилл для Claude Code: фаззинг-обвязки на C/C++
Помогает написать и доработать фаззинг-обвязку: разложить сырые байты по аргументам API, убрать недетерминизм и ложные падения.
npx skills add trailofbits/skills --skill harness-writing -a claude-codeЧто делает harness-writing
Скилл про обвязку (harness) — функцию-точку входа, которая принимает от фаззера случайные байты и передаёт их в тестируемый код. От неё зависит, какие ветки вообще будут пройдены и найдутся ли баги. Скилл разбирает, как выбрать цели, написать минимальный LLVMFuzzerTestOneInput или fuzz_target!, добавить проверку размера и превратить байты в типизированные значения.
Для структурированных входов есть два подхода: приведение типов через *(uint32_t*)(data) и FuzzedDataProvider с методами вроде ConsumeIntegral<uint32_t>() и ConsumeBytesWithTerminator<char>(32, 0xFF). В Rust — i32::from_ne_bytes. Отдельная тема — недетерминизм: если обвязка ведёт себя по-разному на одном и том же входе, падения не воспроизводятся, и это первое, что стоит проверить, когда кампания сыплет невоспроизводимыми крашами.
Скилл пригодится, когда кампания не находит багов или покрытие низкое, когда API требует структурированных данных, а не сырых байтов, и когда несколько связанных функций нужно фаззить вместе. Если в проекте уже есть проверенные обвязки или инструмент генерирует их сам, пользы мало.
Какие задачи решает
- написать первую фаззинг-обвязку для C/C++ или Rust
- разложить сырые байты по аргументам целевого API
- добиться воспроизводимости падений, найденных фаззером
- поднять покрытие кампании, которая ничего не находит
- решить, какие функции фаззить в одной обвязке
Примеры запросов агенту
- Напиши минимальную обвязку
LLVMFuzzerTestOneInputдля парсера заголовков - Переделай обвязку на
FuzzedDataProvider, чтобы получать строки и числа - Кампания находит краши, которые не воспроизводятся — разбери обвязку на недетерминизм
Как установить harness-writing
1Через Skills CLI (Vercel)
npx skills add trailofbits/skills --skill harness-writing -a claude-code2Вручную: положить файлы
~/.claude/skills/harness-writing/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/harness-writing/
1Через Skills CLI (Vercel)
npx skills add trailofbits/skills --skill harness-writing -a codex2Вручную: положить файлы
.agents/skills/harness-writing/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add trailofbits/skills --skill harness-writing -a cursor2Вручную: положить файлы
.cursor/skills/harness-writing/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install trailofbits/skills harness-writing2Вручную: положить файлы
.github/skills/harness-writing/SKILL.md1Через Skills CLI (Vercel)
npx skills add trailofbits/skills --skill harness-writing -a gemini-cli2Командой платформы
gemini skills install https://github.com/trailofbits/skills --path plugins/testing-handbook-skills/skills/harness-writingВручную: положить файлы
.devin/skills/harness-writing/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add trailofbits/skills --skill harness-writing -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о harness-writing
Как установить harness-writing в Claude Code?
Выполните npx skills add trailofbits/skills --skill harness-writing -a claude-code. Скилл появится по пути ~/.claude/skills/harness-writing/SKILL.md.
Что делает harness-writing?
Помогает проектировать и улучшать фаззинг-обвязки для C/C++ и Rust: выбор целей, разбор входных данных, работа с типизированными аргументами и недетерминизмом.
Когда этот скилл не нужен?
Если в проекте уже есть проверенные обвязки или инструмент генерирует их автоматически и результат устраивает.