Mercurial > public > mercurial-scm > hg
diff contrib/fuzz/xdiff.cc @ 36679:624cbd1477a6
fuzz: add a fuzzer for xdiff
Based entirely on the fuzzer for bdiff.
Differential Revision: https://phab.mercurial-scm.org/D2632
author | Augie Fackler <augie@google.com> |
---|---|
date | Sat, 03 Mar 2018 18:58:13 -0500 |
parents | |
children | 04d64163039a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/fuzz/xdiff.cc Sat Mar 03 18:58:13 2018 -0500 @@ -0,0 +1,67 @@ +/* + * xdiff.cc - fuzzer harness for thirdparty/xdiff + * + * Copyright 2018, Google Inc. + * + * This software may be used and distributed according to the terms of + * the GNU General Public License, incorporated herein by reference. + */ +#include "thirdparty/xdiff/xdiff.h" +#include <inttypes.h> +#include <stdlib.h> + +extern "C" { + +int hunk_consumer(long a1, long a2, long b1, long b2, void *priv) +{ + // TODO: probably also test returning -1 from this when things break? + return 0; +} + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) +{ + if (!Size) { + return 0; + } + // figure out a random point in [0, Size] to split our input. + size_t split = Data[0] / 255.0 * Size; + + mmfile_t a, b; + + // `a` input to diff is data[1:split] + a.ptr = (char *)Data + 1; + // which has len split-1 + a.size = split - 1; + // `b` starts at the next byte after `a` ends + b.ptr = a.ptr + a.size; + b.size = Size - split; + xpparam_t xpp = { + XDF_INDENT_HEURISTIC, /* flags */ + NULL, /* anchors */ + 0, /* anchors_nr */ + }; + xdemitconf_t xecfg = { + 0, /* ctxlen */ + 0, /* interhunkctxlen */ + XDL_EMIT_BDIFFHUNK, /* flags */ + NULL, /* find_func */ + NULL, /* find_func_priv */ + hunk_consumer, /* hunk_consume_func */ + }; + xdemitcb_t ecb = { + NULL, /* priv */ + NULL, /* outf */ + }; + xdl_diff(&a, &b, &xpp, &xecfg, &ecb); + return 0; // Non-zero return values are reserved for future use. +} + +#ifdef HG_FUZZER_INCLUDE_MAIN +int main(int argc, char **argv) +{ + const char data[] = "asdf"; + return LLVMFuzzerTestOneInput((const uint8_t *)data, 4); +} +#endif + +} // extern "C"