Make fuzz::next overloads more consistent
Some oss-fuzz bugs (like the linked one) would not reproduce
in Skia proper due to the fact that there were subtle overloads
of the various Fuzz::next() methods in FuzzCanvas.cpp that
were pulled in in Skia proper, but not oss-fuzz.
This puts all of them in to FuzzCommon.h and makes the
matrix and rrect ones opt-in (fuzz_matrix, fuzz_rrect).
Additionally, this renames fuzz.cpp -> FuzzMain.cpp so we
can properly include Fuzz.cpp in oss-fuzz without
having two mains.
Bug: oss-fuzz:10378
Change-Id: I6cf9afb471781b9fadb689482109a1e5662358b5
Reviewed-on: https://skia-review.googlesource.com/154900
Commit-Queue: Kevin Lubick <kjlubick@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/fuzz/FuzzCommon.h b/fuzz/FuzzCommon.h
index 98fab25..11b7317 100644
--- a/fuzz/FuzzCommon.h
+++ b/fuzz/FuzzCommon.h
@@ -9,55 +9,21 @@
#define FuzzCommon_DEFINED
#include "Fuzz.h"
+#include "SkMatrix.h"
#include "SkPath.h"
+#include "SkRRect.h"
#include "SkRegion.h"
-// We don't always want to test NaNs and infinities.
-static inline void fuzz_nice_float(Fuzz* fuzz, float* f) {
- float v;
- fuzz->next(&v);
- constexpr float kLimit = 1.0e35f; // FLT_MAX?
- *f = (v == v && v <= kLimit && v >= -kLimit) ? v : 0.0f;
-}
-
-template <typename... Args>
-inline void fuzz_nice_float(Fuzz* fuzz, float* f, Args... rest) {
- fuzz_nice_float(fuzz, f);
- fuzz_nice_float(fuzz, rest...);
-}
-
-template <typename T, typename Min, typename Max>
-inline void fuzz_enum_range(Fuzz* fuzz, T* value, Min rmin, Max rmax) {
- using U = skstd::underlying_type_t<T>;
- fuzz->nextRange((U*)value, (U)rmin, (U)rmax);
-}
-
-inline void fuzz_region(Fuzz* fuzz, SkRegion* region, int maxN) {
- uint8_t N;
- fuzz->nextRange(&N, 0, maxN);
- for (uint8_t i = 0; i < N; ++i) {
- SkIRect r;
- SkRegion::Op op;
- // Avoid the sentinal value used by Region.
- fuzz->nextRange(&r.fLeft, -2147483646, 2147483646);
- fuzz->nextRange(&r.fTop, -2147483646, 2147483646);
- fuzz->nextRange(&r.fRight, -2147483646, 2147483646);
- fuzz->nextRange(&r.fBottom, -2147483646, 2147483646);
- r.sort();
- fuzz_enum_range(fuzz, &op, (SkRegion::Op)0, SkRegion::kLastOp);
- if (!region->op(r, op)) {
- return;
- }
- }
-}
-
-template <>
-inline void Fuzz::next(SkRegion* region) { fuzz_region(this, region, 10); }
-
// allows some float values for path points
void FuzzPath(Fuzz* fuzz, SkPath* path, int maxOps);
// allows all float values for path points
void BuildPath(Fuzz* fuzz, SkPath* path, int last_verb);
+void FuzzNiceRRect(Fuzz* fuzz, SkRRect* rr);
+
+void FuzzNiceMatrix(Fuzz* fuzz, SkMatrix* m);
+
+void FuzzNiceRegion(Fuzz* fuzz, SkRegion* region, int maxN);
+
#endif