1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker# 3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker# 7*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker# 9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/sanitizers/sanitizers.gni") 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker# Link dependencies for sanitizers for executables. 18*6dbdd20aSAndroid Build Coastguard Workergroup("deps") { 19*6dbdd20aSAndroid Build Coastguard Worker visibility = [ "*" ] 20*6dbdd20aSAndroid Build Coastguard Worker if (using_sanitizer) { 21*6dbdd20aSAndroid Build Coastguard Worker public_configs = [ ":sanitizers_ldflags" ] 22*6dbdd20aSAndroid Build Coastguard Worker deps = [ ":ignorelist_copy" ] 23*6dbdd20aSAndroid Build Coastguard Worker if (is_android && sanitizer_lib != "" && !sanitizer_lib_dir_is_static) { 24*6dbdd20aSAndroid Build Coastguard Worker deps += [ ":copy_sanitizer_lib" ] 25*6dbdd20aSAndroid Build Coastguard Worker } 26*6dbdd20aSAndroid Build Coastguard Worker } 27*6dbdd20aSAndroid Build Coastguard Worker} 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard Workerif (is_android && sanitizer_lib != "" && !sanitizer_lib_dir_is_static) { 30*6dbdd20aSAndroid Build Coastguard Worker copy("copy_sanitizer_lib") { 31*6dbdd20aSAndroid Build Coastguard Worker sources = [ "${sanitizer_lib_dir}/lib${sanitizer_lib}.so" ] 32*6dbdd20aSAndroid Build Coastguard Worker outputs = [ "${root_out_dir}/sanitizer_libs/lib${sanitizer_lib}.so" ] 33*6dbdd20aSAndroid Build Coastguard Worker } 34*6dbdd20aSAndroid Build Coastguard Worker} 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Worker# Add a dependency on the ignorelist.txt file to cause rebuilds when 37*6dbdd20aSAndroid Build Coastguard Worker# the file changes. 38*6dbdd20aSAndroid Build Coastguard Workercopy("ignorelist_copy") { 39*6dbdd20aSAndroid Build Coastguard Worker sources = [ "ignorelist.txt" ] 40*6dbdd20aSAndroid Build Coastguard Worker outputs = [ "${target_out_dir}/ignorelist.txt" ] 41*6dbdd20aSAndroid Build Coastguard Worker} 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Workerconfig("sanitizers_cflags") { 44*6dbdd20aSAndroid Build Coastguard Worker if (using_sanitizer) { 45*6dbdd20aSAndroid Build Coastguard Worker ignorelist_path_ = rebase_path("ignorelist.txt", root_build_dir) 46*6dbdd20aSAndroid Build Coastguard Worker cflags = [ 47*6dbdd20aSAndroid Build Coastguard Worker "-fno-omit-frame-pointer", 48*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize-ignorelist=$ignorelist_path_", 49*6dbdd20aSAndroid Build Coastguard Worker ] 50*6dbdd20aSAndroid Build Coastguard Worker defines = [] 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker if (is_asan) { 53*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fsanitize=address" ] 54*6dbdd20aSAndroid Build Coastguard Worker defines += [ "ADDRESS_SANITIZER" ] 55*6dbdd20aSAndroid Build Coastguard Worker } 56*6dbdd20aSAndroid Build Coastguard Worker if (is_lsan) { 57*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fsanitize=leak" ] 58*6dbdd20aSAndroid Build Coastguard Worker defines += [ "LEAK_SANITIZER" ] 59*6dbdd20aSAndroid Build Coastguard Worker } 60*6dbdd20aSAndroid Build Coastguard Worker if (is_tsan) { 61*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fsanitize=thread" ] 62*6dbdd20aSAndroid Build Coastguard Worker defines += [ 63*6dbdd20aSAndroid Build Coastguard Worker "THREAD_SANITIZER", 64*6dbdd20aSAndroid Build Coastguard Worker "DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL=1", 65*6dbdd20aSAndroid Build Coastguard Worker ] 66*6dbdd20aSAndroid Build Coastguard Worker } 67*6dbdd20aSAndroid Build Coastguard Worker if (is_msan) { 68*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 69*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=memory", 70*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize-memory-track-origins=2", 71*6dbdd20aSAndroid Build Coastguard Worker ] 72*6dbdd20aSAndroid Build Coastguard Worker defines += [ "MEMORY_SANITIZER" ] 73*6dbdd20aSAndroid Build Coastguard Worker } 74*6dbdd20aSAndroid Build Coastguard Worker if (is_ubsan) { 75*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 76*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=bounds", 77*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=float-divide-by-zero", 78*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=integer-divide-by-zero", 79*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=null", 80*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=object-size", 81*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=return", 82*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=returns-nonnull-attribute", 83*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=shift-exponent", 84*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=signed-integer-overflow", 85*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=unreachable", 86*6dbdd20aSAndroid Build Coastguard Worker "-fsanitize=vla-bound", 87*6dbdd20aSAndroid Build Coastguard Worker ] 88*6dbdd20aSAndroid Build Coastguard Worker defines += [ "UNDEFINED_SANITIZER" ] 89*6dbdd20aSAndroid Build Coastguard Worker } 90*6dbdd20aSAndroid Build Coastguard Worker if (is_fuzzer) { 91*6dbdd20aSAndroid Build Coastguard Worker # FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION is also defined by oss-fuzz, 92*6dbdd20aSAndroid Build Coastguard Worker # so using the same name. 93*6dbdd20aSAndroid Build Coastguard Worker defines += [ "FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION" ] 94*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fsanitize=fuzzer-no-link" ] 95*6dbdd20aSAndroid Build Coastguard Worker if (is_asan) { 96*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 97*6dbdd20aSAndroid Build Coastguard Worker "-mllvm", 98*6dbdd20aSAndroid Build Coastguard Worker "-asan-use-private-alias", 99*6dbdd20aSAndroid Build Coastguard Worker ] 100*6dbdd20aSAndroid Build Coastguard Worker } 101*6dbdd20aSAndroid Build Coastguard Worker } 102*6dbdd20aSAndroid Build Coastguard Worker } 103*6dbdd20aSAndroid Build Coastguard Worker} 104*6dbdd20aSAndroid Build Coastguard Worker 105*6dbdd20aSAndroid Build Coastguard Workerconfig("sanitizer_options_link_helper") { 106*6dbdd20aSAndroid Build Coastguard Worker if (is_mac) { 107*6dbdd20aSAndroid Build Coastguard Worker ldflags = [ "-Wl,-U,_sanitizer_options_link_helper" ] 108*6dbdd20aSAndroid Build Coastguard Worker } 109*6dbdd20aSAndroid Build Coastguard Worker} 110*6dbdd20aSAndroid Build Coastguard Worker 111*6dbdd20aSAndroid Build Coastguard Workerconfig("sanitizers_ldflags") { 112*6dbdd20aSAndroid Build Coastguard Worker if (using_sanitizer) { 113*6dbdd20aSAndroid Build Coastguard Worker visibility = [ ":deps" ] 114*6dbdd20aSAndroid Build Coastguard Worker ldflags = [] 115*6dbdd20aSAndroid Build Coastguard Worker if (is_asan) { 116*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-fsanitize=address" ] 117*6dbdd20aSAndroid Build Coastguard Worker } 118*6dbdd20aSAndroid Build Coastguard Worker if (is_lsan) { 119*6dbdd20aSAndroid Build Coastguard Worker # This is not a copy/paste mistake. The LSan runtime library has 120*6dbdd20aSAndroid Build Coastguard Worker # moved into asan. So in order to make LSan work one has to build 121*6dbdd20aSAndroid Build Coastguard Worker # .cc files with -fsanitize=leak but link with -fsanitize=address. 122*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-fsanitize=address" ] 123*6dbdd20aSAndroid Build Coastguard Worker } 124*6dbdd20aSAndroid Build Coastguard Worker if (is_tsan) { 125*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-fsanitize=thread" ] 126*6dbdd20aSAndroid Build Coastguard Worker } 127*6dbdd20aSAndroid Build Coastguard Worker if (is_msan) { 128*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-fsanitize=memory" ] 129*6dbdd20aSAndroid Build Coastguard Worker } 130*6dbdd20aSAndroid Build Coastguard Worker if (is_ubsan) { 131*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-fsanitize=undefined" ] 132*6dbdd20aSAndroid Build Coastguard Worker } 133*6dbdd20aSAndroid Build Coastguard Worker configs = [ ":sanitizer_options_link_helper" ] 134*6dbdd20aSAndroid Build Coastguard Worker } 135*6dbdd20aSAndroid Build Coastguard Worker} 136