1*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
3*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4d32c0d14SRoman Lebedev 
5d32c0d14SRoman Lebedev // Test for unsigned-integer-overflow.
6d32c0d14SRoman Lebedev #include <assert.h>
7d32c0d14SRoman Lebedev #include <climits>
8d32c0d14SRoman Lebedev #include <cstddef>
9d32c0d14SRoman Lebedev #include <cstdint>
10d32c0d14SRoman Lebedev #include <cstdlib>
11d32c0d14SRoman Lebedev #include <iostream>
12d32c0d14SRoman Lebedev 
13a0457c02SRoman Lebedev static volatile int32_t Sink;
14a0457c02SRoman Lebedev static uint8_t Large = UINT8_MAX;
15d32c0d14SRoman Lebedev 
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)16d32c0d14SRoman Lebedev extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
17d32c0d14SRoman Lebedev   assert(Data);
18d32c0d14SRoman Lebedev   if (Size > 0 && Data[0] == 'H') {
19d32c0d14SRoman Lebedev     Sink = 1;
20d32c0d14SRoman Lebedev     if (Size > 1 && Data[1] == 'i') {
21d32c0d14SRoman Lebedev       Sink = 2;
22d32c0d14SRoman Lebedev       if (Size > 2 && Data[2] == '!') {
23d32c0d14SRoman Lebedev         Large = (unsigned int)Large + 1U;  // 'char overflow'.
24d32c0d14SRoman Lebedev       }
25d32c0d14SRoman Lebedev     }
26d32c0d14SRoman Lebedev   }
27d32c0d14SRoman Lebedev   return 0;
28d32c0d14SRoman Lebedev }
29