Concurrency Fuzzing Testing
dzhalaevd/Donatello
Use as the lead skill when Python tests must expose scheduler/interleaving bugs in asyncio, threading, queues, workers, databases, caches, or mixed-concurrency code
Creating fuzz driver for Python libraries using LibFuzzer. An agent skill from benchflow-ai/skillsbench.
$ npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install benchflow-ai/skillsbench fuzzing-python --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/benchflow-ai/skillsbench.git skills-src && mkdir -p .claude/skills && cp -r skills-src/tasks/setup-fuzzing-py/environment/skills/fuzzing-python .claude/skills/fuzzing-python && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fuzzing-python" agent skill from https://github.com/benchflow-ai/skillsbench/tree/main/tasks/setup-fuzzing-py/environment/skills/fuzzing-python into .claude/skills/fuzzing-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fuzzing-python", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/benchflow-ai/skillsbench/tree/main/tasks/setup-fuzzing-py/environment/skills/fuzzing-pythonType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install benchflow-ai/skillsbench fuzzing-python --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benchflow-ai/skillsbench.git skills-src && mkdir -p .agents/skills && cp -r skills-src/tasks/setup-fuzzing-py/environment/skills/fuzzing-python .agents/skills/fuzzing-python && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fuzzing-python" agent skill from https://github.com/benchflow-ai/skillsbench/tree/main/tasks/setup-fuzzing-py/environment/skills/fuzzing-python into .agents/skills/fuzzing-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fuzzing-python", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install benchflow-ai/skillsbench fuzzing-python --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benchflow-ai/skillsbench.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/tasks/setup-fuzzing-py/environment/skills/fuzzing-python .cursor/skills/fuzzing-python && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fuzzing-python" agent skill from https://github.com/benchflow-ai/skillsbench/tree/main/tasks/setup-fuzzing-py/environment/skills/fuzzing-python into .cursor/skills/fuzzing-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fuzzing-python", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/benchflow-ai/skillsbench.git --path tasks/setup-fuzzing-py/environment/skills/fuzzing-python--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install benchflow-ai/skillsbench fuzzing-python --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benchflow-ai/skillsbench.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/tasks/setup-fuzzing-py/environment/skills/fuzzing-python .gemini/skills/fuzzing-python && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fuzzing-python" agent skill from https://github.com/benchflow-ai/skillsbench/tree/main/tasks/setup-fuzzing-py/environment/skills/fuzzing-python into .gemini/skills/fuzzing-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fuzzing-python", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install benchflow-ai/skillsbench fuzzing-pythonInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/benchflow-ai/skillsbench.git skills-src && mkdir -p .github/skills && cp -r skills-src/tasks/setup-fuzzing-py/environment/skills/fuzzing-python .github/skills/fuzzing-python && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fuzzing-python" agent skill from https://github.com/benchflow-ai/skillsbench/tree/main/tasks/setup-fuzzing-py/environment/skills/fuzzing-python into .github/skills/fuzzing-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fuzzing-python", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install benchflow-ai/skillsbench fuzzing-python --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benchflow-ai/skillsbench.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/tasks/setup-fuzzing-py/environment/skills/fuzzing-python .opencode/skills/fuzzing-python && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fuzzing-python" agent skill from https://github.com/benchflow-ai/skillsbench/tree/main/tasks/setup-fuzzing-py/environment/skills/fuzzing-python into .opencode/skills/fuzzing-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fuzzing-python", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fuzzing-pythonCreating fuzz driver for Python libraries using LibFuzzer. An agent skill from benchflow-ai/skillsbench.
Fuzzing Python is an agent skill from benchflow-ai/skillsbench. Creating fuzz driver for Python libraries using LibFuzzer. This skill is useful when agent needs to work with creating fuzz drivers / fuzz targets for Python project and libraries.
Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Security, covering Fuzzing. It works with Python. The repository describes itself as: SkillsBench evaluates how well skills work and how effective agents are at using them. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit 9a1f4dd. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
python3pip3From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comgoogle.github.iocoverage.readthedocs.iollvm.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fuzzing Python loads about 4.2k tokens when it runs. Until then it costs about 49 tokens; SKILL.md has 1,732 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from benchflow-ai/skillsbench at commit 9a1f4dd, republished under its Apache-2.0 licence (© benchflow-ai). 1,732 words, ~4,231 tokens.
.claude/skills/fuzzing-python/SKILL.md (or your agent's skills folder).Fuzz testing for Python projects are Atheris. Atheris is a coverage-guided Python fuzzing engine. It supports fuzzing of Python code, but also native extensions written for CPython. Atheris is based off of libFuzzer. When fuzzing native code, Atheris can be used in combination with Address Sanitizer or Undefined Behavior Sanitizer to catch extra bugs.
You can install prebuilt versions of Atheris with pip:
pip3 install atherisThese wheels come with a built-in libFuzzer, which is fine for fuzzing Python code. If you plan to fuzz native extensions, you may need to build from source to ensure the libFuzzer version in Atheris matches your Clang version.
#!/usr/bin/python3
import atheris
with atheris.instrument_imports():
import some_library
import sys
def TestOneInput(data):
some_library.parse(data)
atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()When fuzzing Python, Atheris will report a failure if the Python code under test throws an uncaught exception.
Atheris collects Python coverage information by instrumenting bytecode. There are 3 options for adding this instrumentation to the bytecode:
You can instrument the libraries you import:
with atheris.instrument_imports():
import foo
from bar import bazThis will cause instrumentation to be added to foo and bar, as well as
any libraries they import.
Or, you can instrument individual functions:
@atheris.instrument_func
def my_function(foo, bar):
print("instrumented")Or finally, you can instrument everything:
atheris.instrument_all()Put this right before atheris.Setup(). This will find every Python function
currently loaded in the interpreter, and instrument it.
This might take a while.
Atheris can additionally instrument regular expression checks, e.g. re.search.
To enable this feature, you will need to add:
atheris.enabled_hooks.add("RegEx")
To your script before your code calls re.compile.
Internally this will import the re module and instrument the necessary functions.
This is currently an experimental feature.
Similarly, Atheris can instrument str methods; currently only str.startswith
and str.endswith are supported. To enable this feature, add
atheris.enabled_hooks.add("str"). This is currently an experimental feature.
You might see this error:
ERROR: no interesting inputs were found. Is the code instrumented for coverage? Exiting.You'll get this error if the first 2 calls to TestOneInput didn't produce any
coverage events. Even if you have instrumented some Python code,
this can happen if the instrumentation isn't reached in those first 2 calls.
(For example, because you have a nontrivial TestOneInput). You can resolve
this by adding an atheris.instrument_func decorator to TestOneInput,
using atheris.instrument_all(), or moving your TestOneInput function into an
instrumented module.
Examining which lines are executed is helpful for understanding the
effectiveness of your fuzzer. Atheris is compatible with
coverage.py: you can run your fuzzer using
the coverage.py module as you would for any other Python program. Here's an
example:
python3 -m coverage run your_fuzzer.py -atheris_runs=10000 # Times to run
python3 -m coverage html
(cd htmlcov && python3 -m http.server 8000)Coverage reports are only generated when your fuzzer exits gracefully. This happens if:
-atheris_runs=<number>, and that many runs have elapsed.sys.exit().No coverage report will be generated if your fuzzer exits due to a
crash in native code, or due to libFuzzer's -runs flag (use -atheris_runs).
If your fuzzer exits via other methods, such as SIGINT (Ctrl+C), Atheris will
attempt to generate a report but may be unable to (depending on your code).
For consistent reports, we recommend always using
-atheris_runs=<number>.
If you'd like to examine coverage when running with your corpus, you can do that with the following command:
python3 -m coverage run your_fuzzer.py corpus_dir/* -atheris_runs=$(( 1 + $(ls corpus_dir | wc -l) ))This will cause Atheris to run on each file in <corpus-dir>, then exit.
Note: atheris use empty data set as the first input even if there is no empty file in <corpus_dir>.
Importantly, if you leave off the -atheris_runs=$(ls corpus_dir | wc -l), no
coverage report will be generated.
Using coverage.py will significantly slow down your fuzzer, so only use it for visualizing coverage; don't use it all the time.
In order for fuzzing native extensions to be effective, your native extensions must be instrumented. See Native Extension Fuzzing for instructions.
Atheris is based on a coverage-guided mutation-based fuzzer (LibFuzzer). This has the advantage of not requiring any grammar definition for generating inputs, making its setup easier. The disadvantage is that it will be harder for the fuzzer to generate inputs for code that parses complex data types. Often the inputs will be rejected early, resulting in low coverage.
Atheris supports custom mutators (as offered by LibFuzzer) to produce grammar-aware inputs.
Example (Atheris-equivalent of the example in the LibFuzzer docs):
@atheris.instrument_func
def TestOneInput(data):
try:
decompressed = zlib.decompress(data)
except zlib.error:
return
if len(decompressed) < 2:
return
try:
if decompressed.decode() == 'FU':
raise RuntimeError('Boom')
except UnicodeDecodeError:
passTo reach the RuntimeError crash, the fuzzer needs to be able to produce inputs
that are valid compressed data and satisfy the checks after decompression.
It is very unlikely that Atheris will be able to produce such inputs: mutations
on the input data will most probably result in invalid data that will fail at
decompression-time.
To overcome this issue, you can define a custom mutator function (equivalent to
LLVMFuzzerCustomMutator).
This example produces valid compressed data. To enable Atheris to make use of
it, pass the custom mutator function to the invocation of atheris.Setup.
def CustomMutator(data, max_size, seed):
try:
decompressed = zlib.decompress(data)
except zlib.error:
decompressed = b'Hi'
else:
decompressed = atheris.Mutate(decompressed, len(decompressed))
return zlib.compress(decompressed)
atheris.Setup(sys.argv, TestOneInput, custom_mutator=CustomMutator)
atheris.Fuzz()As seen in the example, the custom mutator may request Atheris to mutate data
using atheris.Mutate() (this is equivalent to LLVMFuzzerMutate).
You can experiment with custom_mutator_example.py and see that without the mutator Atheris would not be able to find the crash, while with the mutator this is achieved in a matter of seconds.
$ python3 example_fuzzers/custom_mutator_example.py --no_mutator
[...]
#2 INITED cov: 2 ft: 2 corp: 1/1b exec/s: 0 rss: 37Mb
#524288 pulse cov: 2 ft: 2 corp: 1/1b lim: 4096 exec/s: 262144 rss: 37Mb
#1048576 pulse cov: 2 ft: 2 corp: 1/1b lim: 4096 exec/s: 349525 rss: 37Mb
#2097152 pulse cov: 2 ft: 2 corp: 1/1b lim: 4096 exec/s: 299593 rss: 37Mb
#4194304 pulse cov: 2 ft: 2 corp: 1/1b lim: 4096 exec/s: 279620 rss: 37Mb
[...]
$ python3 example_fuzzers/custom_mutator_example.py
[...]
INFO: found LLVMFuzzerCustomMutator (0x7f9c989fb0d0). Disabling -len_control by default.
[...]
#2 INITED cov: 2 ft: 2 corp: 1/1b exec/s: 0 rss: 37Mb
#3 NEW cov: 4 ft: 4 corp: 2/11b lim: 4096 exec/s: 0 rss: 37Mb L: 10/10 MS: 1 Custom-
#12 NEW cov: 5 ft: 5 corp: 3/21b lim: 4096 exec/s: 0 rss: 37Mb L: 10/10 MS: 7 Custom-CrossOver-Custom-CrossOver-Custom-ChangeBit-Custom-
=== Uncaught Python exception: ===
RuntimeError: Boom
Traceback (most recent call last):
File "example_fuzzers/custom_mutator_example.py", line 62, in TestOneInput
raise RuntimeError('Boom')
[...]Custom crossover functions (equivalent to LLVMFuzzerCustomCrossOver) are also
supported. You can pass the custom crossover function to the invocation of
atheris.Setup. See its usage in custom_crossover_fuzz_test.py.
libprotobuf-mutator has bindings to use it together with Atheris to perform structure-aware fuzzing using protocol buffers.
See the documentation for atheris_libprotobuf_mutator.
Atheris is fully supported by OSS-Fuzz, Google's continuous fuzzing service for open source projects. For integrating with OSS-Fuzz, please see https://google.github.io/oss-fuzz/getting-started/new-project-guide/python-lang.
The atheris module provides three key functions: instrument_imports(), Setup() and Fuzz().
In your source file, import all libraries you wish to fuzz inside a with atheris.instrument_imports():-block, like this:
# library_a will not get instrumented
import library_a
with atheris.instrument_imports():
# library_b will get instrumented
import library_bGenerally, it's best to import atheris first and then import all other libraries inside of a with atheris.instrument_imports() block.
Next, define a fuzzer entry point function and pass it to atheris.Setup() along with the fuzzer's arguments (typically sys.argv). Finally, call atheris.Fuzz() to start fuzzing. You must call atheris.Setup() before atheris.Fuzz().
instrument_imports(include=[], exclude=[])include: A list of fully-qualified module names that shall be instrumented.exclude: A list of fully-qualified module names that shall NOT be instrumented.This should be used together with a with-statement. All modules imported in
said statement will be instrumented. However, because Python imports all modules
only once, this cannot be used to instrument any previously imported module,
including modules required by Atheris. To add coverage to those modules, use
instrument_all() instead.
A full list of unsupported modules can be retrieved as follows:
import sys
import atheris
print(sys.modules.keys())instrument_func(func)func: The function to instrument.This will instrument the specified Python function and then return func. This
is typically used as a decorator, but can be used to instrument individual
functions too. Note that the func is instrumented in-place, so this will
affect all call points of the function.
This cannot be called on a bound method - call it on the unbound version.
instrument_all()This will scan over all objects in the interpreter and call instrument_func on
every Python function. This works even on core Python interpreter functions,
something which instrument_imports cannot do.
This function is experimental.
Setup(args, test_one_input, internal_libfuzzer=None)args: A list of strings: the process arguments to pass to the fuzzer, typically sys.argv. This argument list may be modified in-place, to remove arguments consumed by the fuzzer.
See the LibFuzzer docs for a list of such options.test_one_input: your fuzzer's entry point. Must take a single bytes argument. This will be repeatedly invoked with a single bytes container.internal_libfuzzer: Indicates whether libfuzzer will be provided by atheris or by an external library (see native_extension_fuzzing.md). If unspecified, Atheris will determine this
automatically. If fuzzing pure Python, leave this as True.Fuzz()This starts the fuzzer. You must have called Setup() before calling this function. This function does not return.
In many cases Setup() and Fuzz() could be combined into a single function, but they are
separated because you may want the fuzzer to consume the command-line arguments it handles
before passing any remaining arguments to another setup function.
FuzzedDataProviderOften, a bytes object is not convenient input to your code being fuzzed. Similar to libFuzzer, we provide a FuzzedDataProvider to translate these bytes into other input forms.
You can construct the FuzzedDataProvider with:
fdp = atheris.FuzzedDataProvider(input_bytes)The FuzzedDataProvider then supports the following functions:
def ConsumeBytes(count: int)Consume count bytes.
def ConsumeUnicode(count: int)Consume unicode characters. Might contain surrogate pair characters, which according to the specification are invalid in this situation. However, many core software tools (e.g. Windows file paths) support them, so other software often needs to too.
def ConsumeUnicodeNoSurrogates(count: int)Consume unicode characters, but never generate surrogate pair characters.
def ConsumeString(count: int)Alias for ConsumeBytes in Python 2, or ConsumeUnicode in Python 3.
def ConsumeInt(int: bytes)Consume a signed integer of the specified size (when written in two's complement notation).
def ConsumeUInt(int: bytes)Consume an unsigned integer of the specified size.
def ConsumeIntInRange(min: int, max: int)Consume an integer in the range [min, max].
def ConsumeIntList(count: int, bytes: int)Consume a list of count integers of size bytes.
def ConsumeIntListInRange(count: int, min: int, max: int)Consume a list of count integers in the range [min, max].
def ConsumeFloat()Consume an arbitrary floating-point value. Might produce weird values like NaN and Inf.
def ConsumeRegularFloat()Consume an arbitrary numeric floating-point value; never produces a special type like NaN or Inf.
def ConsumeProbability()Consume a floating-point value in the range [0, 1].
def ConsumeFloatInRange(min: float, max: float)Consume a floating-point value in the range [min, max].
def ConsumeFloatList(count: int)Consume a list of count arbitrary floating-point values. Might produce weird values like NaN and Inf.
def ConsumeRegularFloatList(count: int)Consume a list of count arbitrary numeric floating-point values; never produces special types like NaN or Inf.
def ConsumeProbabilityList(count: int)Consume a list of count floats in the range [0, 1].
def ConsumeFloatListInRange(count: int, min: float, max: float)Consume a list of count floats in the range [min, max]
def PickValueInList(l: list)Given a list, pick a random value
def ConsumeBool()Consume either True or False.
Some important things to remember about fuzz targets:
© benchflow-ai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in tasks/setup-fuzzing-py/environment/skills/fuzzing-python of benchflow-ai/skillsbench.
Open the folder on GitHubat commit 9a1f4dd
Fuzzing Python next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fuzzing Python this skillbenchflow-ai/skillsbench | 1.8k | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Concurrency Fuzzing Testingdzhalaevd/Donatello | 135 | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Directed Test Input GeneratorArabelaTso/Skills-4-SE | 253 | — | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Simplified Python Fuzzeropensage-agent/opensage-adk | 127 | — | ~228 | Automated safety check: Pass | Apache-2.0 | |
| Fuzzing Input GeneratorArabelaTso/Skills-4-SE | 253 | — | ~4.9k | Automated safety check: Pass | Apache-2.0 | |
| Security Auditoreigent-ai/eigent | 15k | — | ~1.8k | Automated safety check: Notes | Apache-2.0 |
dzhalaevd/Donatello
Use as the lead skill when Python tests must expose scheduler/interleaving bugs in asyncio, threading, queues, workers, databases, caches, or mixed-concurrency code
ArabelaTso/Skills-4-SE
Generate targeted test inputs to reach specific code paths and hard-to-reach behaviors in Python code.
opensage-agent/opensage-adk
Run a Python fuzzer script (provided as a string) for a fixed duration.
ArabelaTso/Skills-4-SE
Generate randomized and edge-case inputs to detect unexpected failures, bugs, and security vulnerabilities through fuzz testing.
eigent-ai/eigent
Audits source code, dependencies and config files for vulnerabilities and hardcoded secrets, using two bundled Python scanners and an OWASP Top 10 checklist.
pashov/skills
Generate Echidna/Medusa-compatible Solidity fuzz suites from Foundry or Hardhat projects.
benchflow-ai/skillsbench
This skill should be used when working on Lean 4 formalization projects to maintain persistent memory of successful proof patterns, failed approaches, project conventions, and user preferences…
benchflow-ai/skillsbench
World-class data engineering skill for building scalable data pipelines, ETL/ELT systems, real-time streaming, and data infrastructure.
benchflow-ai/skillsbench
AC branch pi-model power flow equations (P/Q and |S|) with transformer tap ratio and phase shift, matching acopf-math-model.md and MATPOWER branch fields.
benchflow-ai/skillsbench
Civilization 6 district mechanics library. An agent skill from benchflow-ai/skillsbench.
benchflow-ai/skillsbench
Build deterministic, verifiable data visualizations with D3.js (v6).
benchflow-ai/skillsbench
DC power flow analysis for power systems. An agent skill from benchflow-ai/skillsbench.
Works with
Categories
Creating fuzz driver for Python libraries using LibFuzzer. An agent skill from benchflow-ai/skillsbench. Fuzzing Python is an agent skill from benchflow-ai/skillsbench. Creating fuzz driver for Python libraries using LibFuzzer.
Fuzzing Python fits situations like: tasks that involve Fuzzing.
Run `npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a claude-code`. Or copy the skill folder (tasks/setup-fuzzing-py/environment/skills/fuzzing-python in benchflow-ai/skillsbench) into .claude/skills/fuzzing-python in your project. Claude Code loads it when a task matches its description.
Run `npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a codex`. Or copy the skill folder (tasks/setup-fuzzing-py/environment/skills/fuzzing-python in benchflow-ai/skillsbench) into .agents/skills/fuzzing-python in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add benchflow-ai/skillsbench --skill fuzzing-python -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fuzzing-python, .gemini/skills/fuzzing-python, .github/skills/fuzzing-python and .opencode/skills/fuzzing-python in your project.
Going by SKILL.md and its folder, Fuzzing Python needs the command-line tools its instructions call (python3 and pip3). Our summary lists: Python 3.
SKILL.md names 4 domains. As links in the text: github.com, google.github.io, coverage.readthedocs.io and llvm.org. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Fuzzing Python is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Fuzzing Python: Concurrency Fuzzing Testing (dzhalaevd/Donatello, 135 stars), Directed Test Input Generator (ArabelaTso/Skills-4-SE, 253 stars), Simplified Python Fuzzer (opensage-agent/opensage-adk, 127 stars) and Fuzzing Input Generator (ArabelaTso/Skills-4-SE, 253 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
benchflow-ai (a GitHub organization) maintains it in benchflow-ai/skillsbench, which has 1,832 GitHub stars. The repository holds 180 skills in this directory. The repository was last updated on July 23, 2026.
Source: benchflow-ai/skillsbench on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.