| # tests/v3/fuzzer/Makefile — Build libFuzzer harnesses for tinygltf v3 |
| # |
| # Requires: clang/clang++ with libFuzzer support |
| # |
| # Targets: |
| # make — build both harnesses with ASan + UBSan |
| # make run — run the dedicated pure-C v3 harness |
| # make run-cpp — run the legacy header-implementation harness |
| # make seed — generate seed corpus from test models |
| # make clean — remove binaries and corpus |
| |
| CC = clang |
| CXX = clang++ |
| CCFLAGS = -g -O1 -std=c11 |
| CXXFLAGS = -g -O1 -std=c++17 -fno-rtti -fno-exceptions |
| SANITIZE = -fsanitize=fuzzer,address,undefined |
| INCLUDES = -I../../.. |
| |
| FUZZER = fuzz_gltf_v3 |
| FUZZER_C = fuzz_gltf_v3_c |
| CORPUS = corpus |
| ARTIFACTS = artifacts |
| |
| # Fuzzer runtime options |
| MAX_LEN ?= 65536 |
| JOBS ?= $(shell nproc 2>/dev/null || echo 4) |
| MAX_TIME ?= 0 |
| FUZZ_ENV ?= LSAN_OPTIONS=detect_leaks=0 |
| |
| .PHONY: all run run-cpp seed clean |
| |
| all: $(FUZZER) $(FUZZER_C) |
| |
| $(FUZZER): fuzz_gltf_v3.cc ../../../tiny_gltf_v3.h ../../../tiny_gltf_v3.c ../../../tinygltf_json_c.h |
| $(CXX) $(CXXFLAGS) $(SANITIZE) $(INCLUDES) -o $@ $< |
| |
| $(FUZZER_C): fuzz_gltf_v3_c.c ../../../tiny_gltf_v3.h ../../../tiny_gltf_v3.c ../../../tinygltf_json_c.h |
| $(CC) $(CCFLAGS) $(SANITIZE) $(INCLUDES) -o $@ $< ../../../tiny_gltf_v3.c |
| |
| run: $(FUZZER_C) | $(CORPUS) $(ARTIFACTS) |
| $(FUZZ_ENV) ./$(FUZZER_C) $(CORPUS) \ |
| -artifact_prefix=$(ARTIFACTS)/ \ |
| -max_len=$(MAX_LEN) \ |
| -jobs=$(JOBS) \ |
| -workers=$(JOBS) \ |
| $(if $(filter-out 0,$(MAX_TIME)),-max_total_time=$(MAX_TIME)) |
| |
| run-cpp: $(FUZZER) | $(CORPUS) $(ARTIFACTS) |
| $(FUZZ_ENV) ./$(FUZZER) $(CORPUS) \ |
| -artifact_prefix=$(ARTIFACTS)/ \ |
| -max_len=$(MAX_LEN) \ |
| -jobs=$(JOBS) \ |
| -workers=$(JOBS) \ |
| $(if $(filter-out 0,$(MAX_TIME)),-max_total_time=$(MAX_TIME)) |
| |
| # Generate seed corpus from existing test models |
| seed: | $(CORPUS) |
| @echo "Seeding corpus from test models..." |
| @for f in ../../../models/Cube/Cube.gltf \ |
| ../../../models/Cube/Cube.glb; do \ |
| if [ -f "$$f" ]; then \ |
| cp "$$f" $(CORPUS)/; \ |
| echo " Added: $$f"; \ |
| fi; \ |
| done |
| @# Add a minimal valid glTF JSON |
| @echo '{"asset":{"version":"2.0"},"scene":0,"scenes":[{"nodes":[0]}],"nodes":[{"name":"n"}]}' > $(CORPUS)/minimal.gltf |
| @# Add a minimal valid GLB (header + empty JSON chunk) |
| @printf 'glTF\x02\x00\x00\x00\x1c\x00\x00\x00\x04\x00\x00\x00JSON{} ' > $(CORPUS)/minimal.glb |
| @# Add edge cases |
| @echo '{}' > $(CORPUS)/empty_object.gltf |
| @echo '{"asset":{"version":"2.0"}}' > $(CORPUS)/asset_only.gltf |
| @echo "Corpus: $$(ls $(CORPUS) | wc -l) files" |
| |
| $(CORPUS): |
| mkdir -p $(CORPUS) |
| |
| $(ARTIFACTS): |
| mkdir -p $(ARTIFACTS) |
| |
| clean: |
| rm -f $(FUZZER) $(FUZZER_C) |
| rm -rf $(CORPUS) $(ARTIFACTS) |