From 1991f5502edef073a005d6efbbc710d8c72f1a8a Mon Sep 17 00:00:00 2001 From: Kevin Lubick Date: Tue, 27 Feb 2018 10:59:10 -0500 Subject: Tweak API fuzzers to run better in libfuzzer Prevents logging from cluttering the stats. Better handles limited memory. Bug: skia: Change-Id: I12c1a46875fd9120938cab520ef70de69c451ad8 Reviewed-on: https://skia-review.googlesource.com/110642 Reviewed-by: Mike Klein Commit-Queue: Kevin Lubick --- fuzz/Fuzz.h | 1 + fuzz/FuzzCanvas.cpp | 14 +++++++++++++- fuzz/FuzzDrawFunctions.cpp | 23 ++++++++++++++--------- fuzz/FuzzGradients.cpp | 14 +++++++------- 4 files changed, 35 insertions(+), 17 deletions(-) (limited to 'fuzz') diff --git a/fuzz/Fuzz.h b/fuzz/Fuzz.h index 221b8f87bf..a7771713cf 100644 --- a/fuzz/Fuzz.h +++ b/fuzz/Fuzz.h @@ -109,6 +109,7 @@ inline void Fuzz::nextRange(T* n, Min min, Max max) { } if (min > max) { // Avoid misuse of nextRange + SkDebugf("min > max (%d > %d) \n", min, max); this->signalBug(); } if (*n < 0) { // Handle negatives diff --git a/fuzz/FuzzCanvas.cpp b/fuzz/FuzzCanvas.cpp index 9e117af66f..42e31b6a4e 100644 --- a/fuzz/FuzzCanvas.cpp +++ b/fuzz/FuzzCanvas.cpp @@ -901,7 +901,10 @@ static SkBitmap make_fuzz_bitmap(Fuzz* fuzz) { int w, h; fuzz->nextRange(&w, 1, 1024); fuzz->nextRange(&h, 1, 1024); - bitmap.allocN32Pixels(w, h); + if (!bitmap.tryAllocN32Pixels(w, h)) { + SkDEBUGF(("Could not allocate pixels %d x %d", w, h)); + return bitmap; + } for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { SkColor c; @@ -973,6 +976,11 @@ static SkTDArray make_fuzz_text(Fuzz* fuzz, const SkPaint& paint) { if (SkPaint::kGlyphID_TextEncoding == paint.getTextEncoding()) { int glyphRange = paint.getTypeface() ? paint.getTypeface()->countGlyphs() : SkTypeface::MakeDefault()->countGlyphs(); + if (glyphRange == 0) { + // Some fuzzing environments have no fonts, so empty array is the best + // we can do. + return array; + } int glyphCount; fuzz->nextRange(&glyphCount, 1, kMaxGlyphCount); SkGlyphID* glyphs = (SkGlyphID*)array.append(glyphCount * sizeof(SkGlyphID)); @@ -1464,6 +1472,10 @@ static void fuzz_canvas(Fuzz* fuzz, SkCanvas* canvas, int depth = 9) { if (make_fuzz_t(fuzz)) { fuzz->next(¢er); } else { // Make valid center, see SkLatticeIter::Valid(). + if (img.width() == 0 || img.height() == 0) { + // bitmap may not have had its pixels initialized. + break; + } fuzz->nextRange(¢er.fLeft, 0, img.width() - 1); fuzz->nextRange(¢er.fTop, 0, img.height() - 1); fuzz->nextRange(¢er.fRight, center.fLeft + 1, img.width()); diff --git a/fuzz/FuzzDrawFunctions.cpp b/fuzz/FuzzDrawFunctions.cpp index 5029ebe967..15443fdd85 100644 --- a/fuzz/FuzzDrawFunctions.cpp +++ b/fuzz/FuzzDrawFunctions.cpp @@ -81,7 +81,7 @@ static void init_bitmap(Fuzz* fuzz, SkBitmap* bmp) { (SkColorType)colorType, b ? kOpaque_SkAlphaType : kPremul_SkAlphaType); if (!bmp->tryAllocPixels(info)) { - SkDebugf("Bitmap not allocated\n"); + SkDEBUGF(("Bitmap not allocated\n")); } SkColor c; fuzz->next(&c); @@ -103,6 +103,11 @@ static void init_surface(Fuzz* fuzz, sk_sp* s) { fuzz->nextRange(&x, 1, kMaxX); fuzz->nextRange(&y, 1, kMaxY); *s = SkSurface::MakeRasterN32Premul(x, y); + + if (!*s) { + // Was possibly too big for the memory constrained fuzzing environments + *s = SkSurface::MakeNull(x, y); + } } @@ -313,36 +318,36 @@ DEF_FUZZ(DrawFunctions, fuzz) { SkDebugf("Could not initialize font.\n"); fuzz->signalBug(); } - SkDebugf("Fuzz DrawText\n"); + SkDEBUGF(("Fuzz DrawText\n")); fuzz_drawText(fuzz, f); return; } case 1: - SkDebugf("Fuzz DrawRect\n"); + SkDEBUGF(("Fuzz DrawRect\n")); fuzz_drawRect(fuzz); return; case 2: - SkDebugf("Fuzz DrawCircle\n"); + SkDEBUGF(("Fuzz DrawCircle\n")); fuzz_drawCircle(fuzz); return; case 3: - SkDebugf("Fuzz DrawLine\n"); + SkDEBUGF(("Fuzz DrawLine\n")); fuzz_drawLine(fuzz); return; case 4: - SkDebugf("Fuzz DrawPath\n"); + SkDEBUGF(("Fuzz DrawPath\n")); fuzz_drawPath(fuzz); return; case 5: - SkDebugf("Fuzz DrawImage/DrawImageRect\n"); + SkDEBUGF(("Fuzz DrawImage/DrawImageRect\n")); fuzz_drawImage(fuzz); return; case 6: - SkDebugf("Fuzz DrawBitmap\n"); + SkDEBUGF(("Fuzz DrawBitmap\n")); fuzz_drawBitmap(fuzz); return; case 7: - SkDebugf("Fuzz DrawPaint\n"); + SkDEBUGF(("Fuzz DrawPaint\n")); fuzz_drawPaint(fuzz); return; } diff --git a/fuzz/FuzzGradients.cpp b/fuzz/FuzzGradients.cpp index 88f3429d50..1c06af52bf 100644 --- a/fuzz/FuzzGradients.cpp +++ b/fuzz/FuzzGradients.cpp @@ -56,11 +56,11 @@ static void logOptionalMatrix(const char* label, const SkMatrix* m) { return; } - SkDebugf(" %s: [ ", label); + SkDEBUGF((" %s: [ ", label)); for (int i = 0; i < 9; ++i) { - SkDebugf("%.9g ", m->get(i)); + SkDEBUGF(("%.9g ", m->get(i))); } - SkDebugf("]\n"); + SkDEBUGF(("]\n")); } static void logLinearGradient(const SkPoint pts[2], @@ -256,19 +256,19 @@ DEF_FUZZ(Gradients, fuzz) { switch(i) { case 0: - SkDebugf("LinearGradient\n"); + SkDEBUGF(("LinearGradient\n")); fuzzLinearGradient(fuzz); return; case 1: - SkDebugf("RadialGradient\n"); + SkDEBUGF(("RadialGradient\n")); fuzzRadialGradient(fuzz); return; case 2: - SkDebugf("TwoPointConicalGradient\n"); + SkDEBUGF(("TwoPointConicalGradient\n")); fuzzTwoPointConicalGradient(fuzz); return; } - SkDebugf("SweepGradient\n"); + SkDEBUGF(("SweepGradient\n")); fuzzSweepGradient(fuzz); return; } -- cgit v1.2.3