---
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import random
|
||||
import re
|
||||
|
||||
_CORPUS: list[str] = []
|
||||
|
||||
|
||||
def _load_corpus() -> None:
|
||||
candidate_paths = [
|
||||
'/fuzzer/additional.sql',
|
||||
]
|
||||
for p in candidate_paths:
|
||||
if not p:
|
||||
continue
|
||||
try:
|
||||
with open(p, 'r', encoding='latin-1') as f:
|
||||
content = f.read()
|
||||
except OSError:
|
||||
continue
|
||||
chunks = [c.strip() for c in content.split('---') if c.strip()]
|
||||
chunks = [
|
||||
c for c in chunks if any(not ln.strip().startswith('--') and ln.strip()
|
||||
for ln in c.split('\n'))
|
||||
]
|
||||
if chunks:
|
||||
_CORPUS.extend(chunks)
|
||||
return
|
||||
|
||||
|
||||
_load_corpus()
|
||||
|
||||
|
||||
def mut_splice_append(s: str) -> str:
|
||||
"""Append a random chunk from the corpus"""
|
||||
|
||||
if not _CORPUS:
|
||||
return s
|
||||
|
||||
return s + '\n' + random.choice(_CORPUS)
|
||||
|
||||
|
||||
def mut_splice_prepend(s: str) -> str:
|
||||
"""Prepend a random chunk from the corpus"""
|
||||
|
||||
if not _CORPUS:
|
||||
return s
|
||||
|
||||
return random.choice(_CORPUS) + '\n' + s
|
||||
|
||||
|
||||
def mut_splice_replace(s: str) -> str:
|
||||
"""Replace s etirely with a random corpus chunk"""
|
||||
|
||||
if not _CORPUS:
|
||||
return s
|
||||
|
||||
return random.choice(_CORPUS)
|
||||
|
||||
|
||||
def mut_splice_intersperse(s: str) -> str:
|
||||
"""Insert a random corpus chunk between two random statements of s"""
|
||||
|
||||
if not _CORPUS:
|
||||
return s
|
||||
parts = re.split(r'(?<=;)\s*\n', s)
|
||||
if len(parts) < 2:
|
||||
return s + '\n' + random.choice(_CORPUS)
|
||||
i = random.randint(1, len(parts) - 1)
|
||||
|
||||
return '\n'.join(parts[:i] + [random.choice(_CORPUS)] + parts[i:])
|
||||
Reference in New Issue
Block a user