blob: 29d9fca71e0495744575b4f72ae936ce6379be66 [file] [log] [blame]
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Bazel rules for building the Honggfuzz binary and the library linked with the
# fuzz test executables.
#
# To use Honggfuzz, the following OS packages need to be installed:
# * libunwind-dev
# * libblocksruntime-dev
# Disable the layering check for including the external headers.
package(features = ["-layering_check"])
HF_ARCH = select({
"@platforms//os:osx": ["-D_HF_ARCH_DARWIN"],
"//conditions:default": ["-D_HF_ARCH_LINUX"],
})
COMMON_COPTS = [
"-D_GNU_SOURCE",
] + HF_ARCH + [
"-fPIC",
"-Wall",
"-Wextra",
"-Werror",
"-Wno-override-init",
"-Wno-initializer-overrides",
"-Wno-gnu-empty-initializer",
"-Wno-format-pedantic",
"-Wno-gnu-statement-expression",
"-mllvm",
"-inline-threshold=2000",
"-fblocks",
# Do not instrument Honggfuzz itself, in order to avoid recursive
# instrumentation calls that would crash the fuzz test binary.
"-fsanitize-coverage=0",
"-fno-sanitize=all",
]
LIBRARY_COPTS = [
"-fno-stack-protector",
"-U_FORTIFY_SOURCE",
"-D_FORTIFY_SOURCE=0",
]
# Linker options for intercepting common memory operations. Should stay in sync
# with https://github.com/google/honggfuzz/blob/master/hfuzz_cc/hfuzz-cc.c
SYMBOL_WRAP_LINKOPTS = select({
"@platforms//os:osx": [],
"//conditions:default": [
# Intercept common *cmp functions.
"-Wl,--wrap=strcmp",
"-Wl,--wrap=strcasecmp",
"-Wl,--wrap=stricmp",
"-Wl,--wrap=strncmp",
"-Wl,--wrap=strncasecmp",
"-Wl,--wrap=strnicmp",
"-Wl,--wrap=strstr",
"-Wl,--wrap=strcasestr",
"-Wl,--wrap=memcmp",
"-Wl,--wrap=bcmp",
"-Wl,--wrap=memmem",
"-Wl,--wrap=strcpy",
# Apache httpd
"-Wl,--wrap=ap_cstr_casecmp",
"-Wl,--wrap=ap_cstr_casecmpn",
"-Wl,--wrap=ap_strcasestr",
"-Wl,--wrap=apr_cstr_casecmp",
"-Wl,--wrap=apr_cstr_casecmpn",
# *SSL
"-Wl,--wrap=CRYPTO_memcmp",
"-Wl,--wrap=OPENSSL_memcmp",
"-Wl,--wrap=OPENSSL_strcasecmp",
"-Wl,--wrap=OPENSSL_strncasecmp",
"-Wl,--wrap=memcmpct",
# libXML2
"-Wl,--wrap=xmlStrncmp",
"-Wl,--wrap=xmlStrcmp",
"-Wl,--wrap=xmlStrEqual",
"-Wl,--wrap=xmlStrcasecmp",
"-Wl,--wrap=xmlStrncasecmp",
"-Wl,--wrap=xmlStrstr",
"-Wl,--wrap=xmlStrcasestr",
# Samba
"-Wl,--wrap=memcmp_const_time",
"-Wl,--wrap=strcsequal",
# LittleCMS
"-Wl,--wrap=cmsstrcasecmp",
# GLib
"-Wl,--wrap=g_strcmp0",
"-Wl,--wrap=g_strcasecmp",
"-Wl,--wrap=g_strncasecmp",
"-Wl,--wrap=g_strstr_len",
"-Wl,--wrap=g_ascii_strcasecmp",
"-Wl,--wrap=g_ascii_strncasecmp",
"-Wl,--wrap=g_str_has_prefix",
"-Wl,--wrap=g_str_has_suffix",
# CUrl
"-Wl,--wrap=Curl_strcasecompare",
"-Wl,--wrap=curl_strequal",
"-Wl,--wrap=Curl_safe_strcasecompare",
"-Wl,--wrap=Curl_strncasecompare",
"-Wl,--wrap=curl_strnequal",
],
})
cc_library(
name = "honggfuzz_common",
srcs = glob(["libhfcommon/*.c"]),
hdrs = glob(["libhfcommon/*.h"]),
copts = COMMON_COPTS + LIBRARY_COPTS,
)
LIB_RT = select({
"@platforms//os:osx": [],
"//conditions:default": ["-lrt"],
})
cc_library(
name = "honggfuzz_engine",
srcs = glob([
"libhfuzz/*.c",
"libhfuzz/*.h",
"*.h",
]),
copts = COMMON_COPTS + LIBRARY_COPTS,
linkopts = SYMBOL_WRAP_LINKOPTS + [
"-ldl",
"-lpthread",
] + LIB_RT,
visibility = ["//visibility:public"],
deps = [
":honggfuzz_common",
],
alwayslink = 1,
)
cc_binary(
name = "honggfuzz",
srcs = glob([
"*.c",
"*.h",
]) + glob([
"linux/*.c",
"linux/*.h",
]),
copts = COMMON_COPTS + [
"-D_HF_LINUX_NO_BFD",
],
includes = [
".",
"linux",
],
# Consider linking statically with
# -l:libunwind-ptrace.a and -l:libunwind-generic.a.
linkopts = [
"-lpthread",
"-lunwind-ptrace",
"-lunwind-generic",
"-lunwind",
] + LIB_RT + [
"-llzma",
"-Wl,-Bstatic",
"-lBlocksRuntime",
"-Wl,-Bdynamic",
],
linkstatic = 1,
visibility = ["//visibility:public"],
deps = [
":honggfuzz_common",
],
)