]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Fail on errors when building fuzzers 3979/head
authorYonatan Komornik <yoniko@gmail.com>
Mon, 18 Mar 2024 22:25:22 +0000 (15:25 -0700)
committerYonatan Komornik <yoniko@gmail.com>
Mon, 18 Mar 2024 22:51:28 +0000 (15:51 -0700)
Fails on errors when building fuzzers with `fuzz.py` (adds `Werror`).
Currently allows `declaration-after-statement`, `c++-compat` and
`deprecated` as they are abundant in code (some fixes to
`declaration-after-statement` are presented in this commit).

tests/fuzz/fuzz.py
tests/fuzz/fuzz_data_producer.c
tests/fuzz/regression_driver.c
tests/fuzz/simple_decompress.c
tests/fuzz/stream_round_trip.c

index c489b8fa64642e5c42b07894a807bf3d98ea9c79..7e1f3c9df07b68a52030f55c5480bd068363c027 100755 (executable)
@@ -405,7 +405,12 @@ def build(args):
     cxxflags = shlex.split(args.cxxflags)
     mflags = shlex.split(args.mflags)
     # Flags to be added to both cflags and cxxflags
-    common_flags = []
+    common_flags = [
+        '-Werror',
+        '-Wno-error=declaration-after-statement',
+        '-Wno-error=c++-compat',
+        '-Wno-error=deprecated' # C files are sometimes compiled with CXX
+    ]
 
     cppflags += [
         '-DDEBUGLEVEL={}'.format(args.debug),
index bf846b68f72b7effd8f16879fe20d6cda7171716..056de3ee9504897954ea3cb4893b6daf9c8112d9 100644 (file)
@@ -28,12 +28,12 @@ void FUZZ_dataProducer_free(FUZZ_dataProducer_t *producer) { free(producer); }
 
 uint32_t FUZZ_dataProducer_uint32Range(FUZZ_dataProducer_t *producer, uint32_t min,
                                   uint32_t max) {
-    FUZZ_ASSERT(min <= max);
-
     uint32_t range = max - min;
     uint32_t rolling = range;
     uint32_t result = 0;
 
+    FUZZ_ASSERT(min <= max);
+
     while (rolling > 0 && producer->size > 0) {
       uint8_t next = *(producer->data + producer->size - 1);
       producer->size -= 1;
@@ -79,11 +79,11 @@ int FUZZ_dataProducer_empty(FUZZ_dataProducer_t *producer) {
 
 size_t FUZZ_dataProducer_contract(FUZZ_dataProducer_t *producer, size_t newSize)
 {
-    newSize = newSize > producer->size ? producer->size : newSize;
+    const size_t effectiveNewSize = newSize > producer->size ? producer->size : newSize;
 
-    size_t remaining = producer->size - newSize;
+    size_t remaining = producer->size - effectiveNewSize;
     producer->data = producer->data + remaining;
-    producer->size = newSize;
+    producer->size = effectiveNewSize;
     return remaining;
 }
 
index 550c65d8600526dc3f3786999e236930e42a3fec..26e2b6af4f91ebabdad4439591a61c8abe19166b 100644 (file)
@@ -44,11 +44,12 @@ int main(int argc, char const **argv) {
     fprintf(stderr, "WARNING: No files passed to %s\n", argv[0]);
   for (i = 0; i < files->tableSize; ++i) {
     char const *fileName = files->fileNames[i];
-    DEBUGLOG(3, "Running %s", fileName);
     size_t const fileSize = UTIL_getFileSize(fileName);
     size_t readSize;
     FILE *file;
 
+    DEBUGLOG(3, "Running %s", fileName);
+
     /* Check that it is a regular file, and that the fileSize is valid.
      * If it is not a regular file, then it may have been deleted since we
      * constructed the list, so just skip it, but return an error exit code.
index ab4697ff1fc91239350d933170a673dcaf522302..0dc9e5b7c5b38ffed39e29bcf960e57db8658488 100644 (file)
@@ -37,17 +37,18 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
         FUZZ_ASSERT(dctx);
     }
 
-    size_t const bufSize = FUZZ_dataProducer_uint32Range(producer, 0, 10 * size);
-    void *rBuf = FUZZ_malloc(bufSize);
-
-    size_t const dSize = ZSTD_decompressDCtx(dctx, rBuf, bufSize, src, size);
-    if (!ZSTD_isError(dSize)) {
-        /* If decompression was successful, the content size from the frame header(s) should be valid. */
-        unsigned long long const expectedSize = ZSTD_findDecompressedSize(src, size);
-        FUZZ_ASSERT(expectedSize != ZSTD_CONTENTSIZE_ERROR);
-        FUZZ_ASSERT(expectedSize == ZSTD_CONTENTSIZE_UNKNOWN || expectedSize == dSize);
+    {
+        size_t const bufSize = FUZZ_dataProducer_uint32Range(producer, 0, 10 * size);
+        void *rBuf = FUZZ_malloc(bufSize);
+        size_t const dSize = ZSTD_decompressDCtx(dctx, rBuf, bufSize, src, size);
+        if (!ZSTD_isError(dSize)) {
+            /* If decompression was successful, the content size from the frame header(s) should be valid. */
+            unsigned long long const expectedSize = ZSTD_findDecompressedSize(src, size);
+            FUZZ_ASSERT(expectedSize != ZSTD_CONTENTSIZE_ERROR);
+            FUZZ_ASSERT(expectedSize == ZSTD_CONTENTSIZE_UNKNOWN || expectedSize == dSize);
+        }
+        free(rBuf);
     }
-    free(rBuf);
 
     FUZZ_dataProducer_free(producer);
 
index c2d6707a1ced37592838d6e3cf442b4ed107344b..6e340c81d2dbe8385bc0bad7d5013946c6f0ce76 100644 (file)
@@ -136,7 +136,7 @@ static size_t compress(uint8_t *dst, size_t capacity,
     return dstSize;
 }
 
-size_t decompress(void* dst, size_t dstCapacity, void const* src, size_t srcSize, FUZZ_dataProducer_t* producer)
+static size_t decompress(void* dst, size_t dstCapacity, void const* src, size_t srcSize, FUZZ_dataProducer_t* producer)
 {
     ZSTD_inBuffer in = {src, srcSize, 0};
     ZSTD_outBuffer out = {dst, dstCapacity, 0};