xref: /aosp_15_r20/external/lz4/ossfuzz/fuzz_helpers.h (revision 27162e4e17433d5aa7cb38e7b6a433a09405fc7f)
1*27162e4eSAndroid Build Coastguard Worker /*
2*27162e4eSAndroid Build Coastguard Worker  * Copyright (c) 2016-present, Facebook, Inc.
3*27162e4eSAndroid Build Coastguard Worker  * All rights reserved.
4*27162e4eSAndroid Build Coastguard Worker  *
5*27162e4eSAndroid Build Coastguard Worker  * This source code is licensed under both the BSD-style license (found in the
6*27162e4eSAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*27162e4eSAndroid Build Coastguard Worker  * in the COPYING file in the root directory of this source tree),
8*27162e4eSAndroid Build Coastguard Worker  * meaning you may select, at your option, one of the above-listed licenses.
9*27162e4eSAndroid Build Coastguard Worker  */
10*27162e4eSAndroid Build Coastguard Worker 
11*27162e4eSAndroid Build Coastguard Worker /**
12*27162e4eSAndroid Build Coastguard Worker  * Helper functions for fuzzing.
13*27162e4eSAndroid Build Coastguard Worker  */
14*27162e4eSAndroid Build Coastguard Worker 
15*27162e4eSAndroid Build Coastguard Worker #ifndef FUZZ_HELPERS_H
16*27162e4eSAndroid Build Coastguard Worker #define FUZZ_HELPERS_H
17*27162e4eSAndroid Build Coastguard Worker 
18*27162e4eSAndroid Build Coastguard Worker #include "fuzz.h"
19*27162e4eSAndroid Build Coastguard Worker #include "xxhash.h"
20*27162e4eSAndroid Build Coastguard Worker #include <stdint.h>
21*27162e4eSAndroid Build Coastguard Worker #include <stdio.h>
22*27162e4eSAndroid Build Coastguard Worker #include <stdlib.h>
23*27162e4eSAndroid Build Coastguard Worker 
24*27162e4eSAndroid Build Coastguard Worker #ifdef __cplusplus
25*27162e4eSAndroid Build Coastguard Worker extern "C" {
26*27162e4eSAndroid Build Coastguard Worker #endif
27*27162e4eSAndroid Build Coastguard Worker 
28*27162e4eSAndroid Build Coastguard Worker #define LZ4_COMMONDEFS_ONLY
29*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4_SRC_INCLUDED
30*27162e4eSAndroid Build Coastguard Worker #include "lz4.c"   /* LZ4_count, constants, mem */
31*27162e4eSAndroid Build Coastguard Worker #endif
32*27162e4eSAndroid Build Coastguard Worker 
33*27162e4eSAndroid Build Coastguard Worker #define MIN(a,b)   ( (a) < (b) ? (a) : (b) )
34*27162e4eSAndroid Build Coastguard Worker #define MAX(a,b)   ( (a) > (b) ? (a) : (b) )
35*27162e4eSAndroid Build Coastguard Worker 
36*27162e4eSAndroid Build Coastguard Worker #define FUZZ_QUOTE_IMPL(str) #str
37*27162e4eSAndroid Build Coastguard Worker #define FUZZ_QUOTE(str) FUZZ_QUOTE_IMPL(str)
38*27162e4eSAndroid Build Coastguard Worker 
39*27162e4eSAndroid Build Coastguard Worker /**
40*27162e4eSAndroid Build Coastguard Worker  * Asserts for fuzzing that are always enabled.
41*27162e4eSAndroid Build Coastguard Worker  */
42*27162e4eSAndroid Build Coastguard Worker #define FUZZ_ASSERT_MSG(cond, msg)                                             \
43*27162e4eSAndroid Build Coastguard Worker   ((cond) ? (void)0                                                            \
44*27162e4eSAndroid Build Coastguard Worker           : (fprintf(stderr, "%s: %u: Assertion: `%s' failed. %s\n", __FILE__, \
45*27162e4eSAndroid Build Coastguard Worker                      __LINE__, FUZZ_QUOTE(cond), (msg)),                       \
46*27162e4eSAndroid Build Coastguard Worker              abort()))
47*27162e4eSAndroid Build Coastguard Worker #define FUZZ_ASSERT(cond) FUZZ_ASSERT_MSG((cond), "")
48*27162e4eSAndroid Build Coastguard Worker 
49*27162e4eSAndroid Build Coastguard Worker #if defined(__GNUC__)
50*27162e4eSAndroid Build Coastguard Worker #define FUZZ_STATIC static __inline __attribute__((unused))
51*27162e4eSAndroid Build Coastguard Worker #elif defined(__cplusplus) ||                                                  \
52*27162e4eSAndroid Build Coastguard Worker     (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
53*27162e4eSAndroid Build Coastguard Worker #define FUZZ_STATIC static inline
54*27162e4eSAndroid Build Coastguard Worker #elif defined(_MSC_VER)
55*27162e4eSAndroid Build Coastguard Worker #define FUZZ_STATIC static __inline
56*27162e4eSAndroid Build Coastguard Worker #else
57*27162e4eSAndroid Build Coastguard Worker #define FUZZ_STATIC static
58*27162e4eSAndroid Build Coastguard Worker #endif
59*27162e4eSAndroid Build Coastguard Worker 
60*27162e4eSAndroid Build Coastguard Worker /**
61*27162e4eSAndroid Build Coastguard Worker  * Deterministically constructs a seed based on the fuzz input.
62*27162e4eSAndroid Build Coastguard Worker  * Consumes up to the first FUZZ_RNG_SEED_SIZE bytes of the input.
63*27162e4eSAndroid Build Coastguard Worker  */
FUZZ_seed(uint8_t const ** src,size_t * size)64*27162e4eSAndroid Build Coastguard Worker FUZZ_STATIC uint32_t FUZZ_seed(uint8_t const **src, size_t* size) {
65*27162e4eSAndroid Build Coastguard Worker     uint8_t const *data = *src;
66*27162e4eSAndroid Build Coastguard Worker     size_t const toHash = MIN(FUZZ_RNG_SEED_SIZE, *size);
67*27162e4eSAndroid Build Coastguard Worker     *size -= toHash;
68*27162e4eSAndroid Build Coastguard Worker     *src += toHash;
69*27162e4eSAndroid Build Coastguard Worker     return XXH32(data, toHash, 0);
70*27162e4eSAndroid Build Coastguard Worker }
71*27162e4eSAndroid Build Coastguard Worker 
72*27162e4eSAndroid Build Coastguard Worker #define FUZZ_rotl32(x, r) (((x) << (r)) | ((x) >> (32 - (r))))
73*27162e4eSAndroid Build Coastguard Worker 
FUZZ_rand(uint32_t * state)74*27162e4eSAndroid Build Coastguard Worker FUZZ_STATIC uint32_t FUZZ_rand(uint32_t *state) {
75*27162e4eSAndroid Build Coastguard Worker     static const uint32_t prime1 = 2654435761U;
76*27162e4eSAndroid Build Coastguard Worker     static const uint32_t prime2 = 2246822519U;
77*27162e4eSAndroid Build Coastguard Worker     uint32_t rand32 = *state;
78*27162e4eSAndroid Build Coastguard Worker     rand32 *= prime1;
79*27162e4eSAndroid Build Coastguard Worker     rand32 += prime2;
80*27162e4eSAndroid Build Coastguard Worker     rand32 = FUZZ_rotl32(rand32, 13);
81*27162e4eSAndroid Build Coastguard Worker     *state = rand32;
82*27162e4eSAndroid Build Coastguard Worker     return rand32 >> 5;
83*27162e4eSAndroid Build Coastguard Worker }
84*27162e4eSAndroid Build Coastguard Worker 
85*27162e4eSAndroid Build Coastguard Worker /* Returns a random number in the range [min, max]. */
FUZZ_rand32(uint32_t * state,uint32_t min,uint32_t max)86*27162e4eSAndroid Build Coastguard Worker FUZZ_STATIC uint32_t FUZZ_rand32(uint32_t *state, uint32_t min, uint32_t max) {
87*27162e4eSAndroid Build Coastguard Worker     uint32_t random = FUZZ_rand(state);
88*27162e4eSAndroid Build Coastguard Worker     return min + (random % (max - min + 1));
89*27162e4eSAndroid Build Coastguard Worker }
90*27162e4eSAndroid Build Coastguard Worker 
91*27162e4eSAndroid Build Coastguard Worker #ifdef __cplusplus
92*27162e4eSAndroid Build Coastguard Worker }
93*27162e4eSAndroid Build Coastguard Worker #endif
94*27162e4eSAndroid Build Coastguard Worker 
95*27162e4eSAndroid Build Coastguard Worker #endif
96