| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // Test whether calling certain libFuzzer's interceptors inside allocators | |
| // does not cause an assertion failure. | |
| #include <assert.h> | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <cstdlib> | |
| #include <cstring> | |
| #include <iostream> | |
| #include <malloc.h> | |
| static const char *buf1 = "aaaa"; | |
| static const char *buf2 = "bbbb"; | |
| static void callFuzzerInterceptors(const char *prefix) { | |
| int memcmp_result = memcmp(buf1, buf2, 4); | |
| if (memcmp_result != 0) { | |
| fprintf(stderr, "%s-MEMCMP\n", prefix); | |
| } | |
| int strncmp_result = strncmp(buf1, buf2, 4); | |
| if (strncmp_result != 0) { | |
| fprintf(stderr, "%s-STRNCMP\n", prefix); | |
| } | |
| int strcmp_result = strcmp(buf1, buf2); | |
| if (strcmp_result != 0) { | |
| fprintf(stderr, "%s-STRCMP\n", prefix); | |
| } | |
| const char *strstr_result = strstr(buf1, buf2); | |
| if (strstr_result == nullptr) { | |
| fprintf(stderr, "%s-STRSTR\n", prefix); | |
| } | |
| } | |
| extern "C" void *__libc_calloc(size_t, size_t); | |
| extern "C" void *calloc(size_t n, size_t elem_size) { | |
| static bool CalledOnce = false; | |
| if (!CalledOnce) { | |
| callFuzzerInterceptors("CALLOC"); | |
| CalledOnce = true; | |
| } | |
| return __libc_calloc(n, elem_size); | |
| } |