47 lines · cpp
1// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.2// See https://llvm.org/LICENSE.txt for license information.3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception4 5// Test whether calling certain libFuzzer's interceptors inside allocators6// does not cause an assertion failure.7#include <assert.h>8#include <cstddef>9#include <cstdint>10#include <cstdlib>11#include <cstring>12#include <iostream>13#include <malloc.h>14 15static const char *buf1 = "aaaa";16static const char *buf2 = "bbbb";17 18static void callFuzzerInterceptors(const char *prefix) {19 int memcmp_result = memcmp(buf1, buf2, 4);20 if (memcmp_result != 0) {21 fprintf(stderr, "%s-MEMCMP\n", prefix);22 }23 int strncmp_result = strncmp(buf1, buf2, 4);24 if (strncmp_result != 0) {25 fprintf(stderr, "%s-STRNCMP\n", prefix);26 }27 int strcmp_result = strcmp(buf1, buf2);28 if (strcmp_result != 0) {29 fprintf(stderr, "%s-STRCMP\n", prefix);30 }31 const char *strstr_result = strstr(buf1, buf2);32 if (strstr_result == nullptr) {33 fprintf(stderr, "%s-STRSTR\n", prefix);34 }35}36 37extern "C" void *__libc_calloc(size_t, size_t);38 39extern "C" void *calloc(size_t n, size_t elem_size) {40 static bool CalledOnce = false;41 if (!CalledOnce) {42 callFuzzerInterceptors("CALLOC");43 CalledOnce = true;44 }45 return __libc_calloc(n, elem_size);46}47