784 lines
24 KiB
Python
784 lines
24 KiB
Python
"""Copyright (C) 2022 The Android Open Source Project
|
|
|
|
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
|
|
|
|
http://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.
|
|
"""
|
|
|
|
load("@bazel_skylib//lib:paths.bzl", "paths")
|
|
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
|
|
load(
|
|
"//build/bazel/rules/test_common:flags.bzl",
|
|
"action_flags_absent_for_mnemonic_test",
|
|
"action_flags_present_only_for_mnemonic_test",
|
|
)
|
|
load(
|
|
":cc_toolchain_constants.bzl",
|
|
"libclang_ubsan_minimal_rt_prebuilt_map",
|
|
)
|
|
load(
|
|
":cc_toolchain_features.bzl",
|
|
"int_overflow_ignorelist_filename",
|
|
"int_overflow_ignorelist_path",
|
|
)
|
|
|
|
compile_action_mnemonic = "CppCompile"
|
|
link_action_mnemonic = "CppLink"
|
|
ubsan_prefix_format = "-fsanitize=%s"
|
|
|
|
def _ubsan_sanitizer_test(
|
|
name,
|
|
target_under_test,
|
|
expected_sanitizers):
|
|
action_flags_present_only_for_mnemonic_test(
|
|
name = name,
|
|
target_under_test = target_under_test,
|
|
mnemonics = [compile_action_mnemonic, link_action_mnemonic],
|
|
expected_flags = [
|
|
ubsan_prefix_format % sanitizer
|
|
for sanitizer in expected_sanitizers
|
|
],
|
|
)
|
|
|
|
# Include these different file types to make sure that all actions types are
|
|
# triggered
|
|
test_srcs = [
|
|
"foo.cpp",
|
|
"bar.c",
|
|
"baz.s",
|
|
"blah.S",
|
|
]
|
|
|
|
def _test_ubsan_integer_overflow_feature():
|
|
name = "ubsan_integer_overflow"
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_integer_overflow"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
int_overflow_test_name = name + "_test"
|
|
test_names = [int_overflow_test_name]
|
|
_ubsan_sanitizer_test(
|
|
name = int_overflow_test_name,
|
|
target_under_test = name,
|
|
expected_sanitizers = [
|
|
"signed-integer-overflow",
|
|
"unsigned-integer-overflow",
|
|
],
|
|
)
|
|
|
|
ignorelist_test_name = name + "_ignorelist_flag_test"
|
|
test_names += [ignorelist_test_name]
|
|
action_flags_present_only_for_mnemonic_test(
|
|
name = ignorelist_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_flags = ["-fsanitize-ignorelist=%s/%s" % (
|
|
int_overflow_ignorelist_path,
|
|
int_overflow_ignorelist_filename,
|
|
)],
|
|
)
|
|
return test_names
|
|
|
|
def _test_ubsan_misc_undefined_feature():
|
|
name = "ubsan_misc_undefined"
|
|
test_name = name + "_test"
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"], # Just pick one; doesn't matter which
|
|
tags = ["manual"],
|
|
)
|
|
_ubsan_sanitizer_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_sanitizers = ["undefined"],
|
|
)
|
|
return test_name
|
|
|
|
def _ubsan_disablement_test(
|
|
name,
|
|
target_under_test,
|
|
expected_disabled_sanitizer,
|
|
disabled,
|
|
target_compatible_with):
|
|
no_sanitize_flag_prefix_format = "-fno-sanitize=%s"
|
|
if disabled:
|
|
action_flags_present_only_for_mnemonic_test(
|
|
name = name,
|
|
target_under_test = target_under_test,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_flags = [
|
|
no_sanitize_flag_prefix_format % expected_disabled_sanitizer,
|
|
],
|
|
target_compatible_with = target_compatible_with,
|
|
)
|
|
else:
|
|
action_flags_absent_for_mnemonic_test(
|
|
name = name,
|
|
target_under_test = target_under_test,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_absent_flags = [
|
|
no_sanitize_flag_prefix_format % expected_disabled_sanitizer,
|
|
],
|
|
target_compatible_with = target_compatible_with,
|
|
)
|
|
|
|
def ubsan_disablement_linux_test(
|
|
name,
|
|
target_under_test,
|
|
expected_disabled_sanitizer,
|
|
disabled):
|
|
_ubsan_disablement_test(
|
|
name = name,
|
|
target_under_test = target_under_test,
|
|
expected_disabled_sanitizer = expected_disabled_sanitizer,
|
|
disabled = disabled,
|
|
target_compatible_with = ["@//build/bazel/platforms/os:linux"],
|
|
)
|
|
|
|
def ubsan_disablement_linux_bionic_test(
|
|
name,
|
|
target_under_test,
|
|
expected_disabled_sanitizer,
|
|
disabled):
|
|
_ubsan_disablement_test(
|
|
name = name,
|
|
target_under_test = target_under_test,
|
|
expected_disabled_sanitizer = expected_disabled_sanitizer,
|
|
disabled = disabled,
|
|
target_compatible_with = ["@//build/bazel/platforms/os:linux_bionic"],
|
|
)
|
|
|
|
def ubsan_disablement_android_test(
|
|
name,
|
|
target_under_test,
|
|
expected_disabled_sanitizer,
|
|
disabled):
|
|
_ubsan_disablement_test(
|
|
name = name,
|
|
target_under_test = target_under_test,
|
|
expected_disabled_sanitizer = expected_disabled_sanitizer,
|
|
disabled = disabled,
|
|
target_compatible_with = ["@//build/bazel/platforms/os:android"],
|
|
)
|
|
|
|
def _test_ubsan_implicit_integer_sign_change_disabled_when_linux_with_integer():
|
|
name = "ubsan_implicit_integer_sign_change_disabled_when_linux_with_integer"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_integer"],
|
|
tags = ["manual"],
|
|
)
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "implicit-integer-sign-change",
|
|
disabled = True,
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_ubsan_implicit_integer_sign_change_not_disabled_when_specified():
|
|
name = "ubsan_implicit_integer_sign_change_not_disabled_when_specified"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = [
|
|
"ubsan_integer",
|
|
"ubsan_implicit-integer-sign-change",
|
|
],
|
|
tags = ["manual"],
|
|
)
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "implicit-integer-sign-change",
|
|
disabled = False,
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_ubsan_implicit_integer_sign_change_not_disabled_without_integer():
|
|
name = "ubsan_implicit_integer_sign_change_not_disabled_without_integer"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
tags = ["manual"],
|
|
)
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "implicit-integer-sign-change",
|
|
disabled = False,
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_ubsan_unsigned_shift_base_disabled_when_linux_with_integer():
|
|
name = "ubsan_unsigned_shift_base_disabled_when_linux_with_integer"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_integer"],
|
|
tags = ["manual"],
|
|
)
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "unsigned-shift-base",
|
|
disabled = True,
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_ubsan_unsigned_shift_base_not_disabled_when_specified():
|
|
name = "ubsan_unsigned_shift_base_not_disabled_when_specified"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = [
|
|
"ubsan_integer",
|
|
"ubsan_unsigned-shift-base",
|
|
],
|
|
tags = ["manual"],
|
|
)
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "unsigned-shift-base",
|
|
disabled = False,
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_ubsan_unsigned_shift_base_not_disabled_without_integer():
|
|
name = "ubsan_unsigned_shift_base_not_disabled_without_integer"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
tags = ["manual"],
|
|
)
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "unsigned-shift-base",
|
|
disabled = False,
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_ubsan_unsupported_non_bionic_checks_disabled_when_linux():
|
|
name = "ubsan_unsupported_non_bionic_checks_disabled_when_linux"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "function,vptr",
|
|
disabled = True,
|
|
)
|
|
|
|
return test_name
|
|
|
|
# TODO(b/263787980): Uncomment when bionic toolchain is implemented
|
|
#def _test_ubsan_unsupported_non_bionic_checks_not_disabled_when_linux_bionic():
|
|
# name = "ubsan_unsupported_non_bionic_checks_not_disabled_when_linux_bionic"
|
|
# test_name = name + "_test"
|
|
#
|
|
# native.cc_binary(
|
|
# name = name,
|
|
# srcs = test_srcs,
|
|
# features = ["ubsan_undefined"],
|
|
# tags = ["manual"],
|
|
# )
|
|
#
|
|
# ubsan_disablement_linux_bionic_test(
|
|
# name = test_name,
|
|
# target_under_test = name,
|
|
# expected_disabled_sanitizer = "function,vptr",
|
|
# disabled = False,
|
|
# )
|
|
#
|
|
# return test_name
|
|
|
|
def _test_ubsan_unsupported_non_bionic_checks_not_disabled_when_android():
|
|
name = "ubsan_unsupported_non_bionic_checks_not_disabled_when_android"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
ubsan_disablement_android_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "function,vptr",
|
|
disabled = False,
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_ubsan_unsupported_non_bionic_checks_not_disabled_when_no_ubsan():
|
|
name = "ubsan_unsupported_non_bionic_checks_not_disabled_when_no_ubsan"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
tags = ["manual"],
|
|
)
|
|
|
|
ubsan_disablement_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
expected_disabled_sanitizer = "function,vptr",
|
|
disabled = False,
|
|
)
|
|
|
|
return test_name
|
|
|
|
sanitizer_no_link_runtime_flag = "-fno-sanitize-link-runtime"
|
|
|
|
def _test_ubsan_no_link_runtime():
|
|
name = "ubsan_no_link_runtime"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
android_test_name = name + "_when_android_test"
|
|
test_names = [android_test_name]
|
|
action_flags_present_android_test(
|
|
name = android_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [link_action_mnemonic],
|
|
expected_flags = [sanitizer_no_link_runtime_flag],
|
|
)
|
|
|
|
# TODO(b/263787980): Uncomment when bionic toolchain is implemented
|
|
# bionic_test_name = name + "_when_bionic_test"
|
|
# action_flags_linux_bionic_test(
|
|
# name = bionic_test_name,
|
|
# target_under_test = name,
|
|
# mnemonics = [link_action_mnemonic],
|
|
# expected_flags = [sanitizer_no_link_runtime_flag],
|
|
# )
|
|
# test_names += [bionic_test_name]
|
|
|
|
# TODO(b/263787526): Uncomment when musl toolchain is implemented
|
|
# musl_test_name = name + "_when_musl_test"
|
|
# action_flags_musl_test(
|
|
# name = musl_test_name,
|
|
# target_under_test = name,
|
|
# mnemonics = [link_action_mnemonic],
|
|
# expected_flags = [sanitizer_no_link_runtime_flag],
|
|
# )
|
|
# test_names += [musl_test_name]
|
|
|
|
return test_names
|
|
|
|
def action_flags_present_linux_test(**kwargs):
|
|
action_flags_present_only_for_mnemonic_test(
|
|
target_compatible_with = ["@//build/bazel/platforms/os:linux"],
|
|
**kwargs
|
|
)
|
|
|
|
def action_flags_present_android_test(**kwargs):
|
|
action_flags_present_only_for_mnemonic_test(
|
|
target_compatible_with = ["@//build/bazel/platforms/os:android"],
|
|
**kwargs
|
|
)
|
|
|
|
# TODO(b/263787980): Uncomment when bionic toolchain is implemented
|
|
#def action_flags_present_linux_bionic_test(**kwargs):
|
|
# action_flags_present_only_for_mnemonic_test(
|
|
# target_compatible_with = ["@//build/bazel/platforms/os:linux_bionic"],
|
|
# **kwargs
|
|
# )
|
|
|
|
# TODO(b/263787526): Uncomment when musl toolchain is implemented
|
|
#def action_flags_present_linux_musl_test(**kwargs):
|
|
# action_flags_present_only_for_mnemonic_test(
|
|
# target_compatible_with = ["@//build/bazel/platforms/os:linux_musl"],
|
|
# **kwargs
|
|
# )
|
|
|
|
def action_flags_absent_linux_test(**kwargs):
|
|
action_flags_absent_for_mnemonic_test(
|
|
target_compatible_with = ["@//build/bazel/platforms/os:linux"],
|
|
**kwargs
|
|
)
|
|
|
|
def action_flags_absent_android_test(**kwargs):
|
|
action_flags_absent_for_mnemonic_test(
|
|
target_compatible_with = ["@//build/bazel/platforms/os:android"],
|
|
**kwargs
|
|
)
|
|
|
|
# TODO(b/263787980): Uncomment when bionic toolchain is implemented
|
|
#def action_flags_absent_linux_bionic_test(**kwargs):
|
|
# action_flags_absent_for_mnemonic_test(
|
|
# target_compatible_with = ["@//build/bazel/platforms/os:linux_bionic"],
|
|
# **kwargs
|
|
# )
|
|
|
|
# TODO(b/263787526): Uncomment when musl toolchain is implemented
|
|
#def action_flags_absent_linux_musl_test(**kwargs):
|
|
# action_flags_absent_for_mnemonic_test(
|
|
# target_compatible_with = ["@//build/bazel/platforms/os:linux_musl"],
|
|
# **kwargs
|
|
# )
|
|
|
|
def _test_ubsan_link_runtime_when_not_bionic_or_musl():
|
|
name = "ubsan_link_runtime_when_not_bionic_or_musl"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
tags = ["manual"],
|
|
)
|
|
|
|
action_flags_absent_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
mnemonics = [link_action_mnemonic],
|
|
expected_absent_flags = [sanitizer_no_link_runtime_flag],
|
|
)
|
|
|
|
return test_name
|
|
|
|
no_undefined_flag = "-Wl,--no-undefined"
|
|
|
|
def _test_no_undefined_flag_present_when_bionic_or_musl():
|
|
name = "no_undefined_flag_present_when_bionic_or_musl"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
android_test_name = name + "_when_android_test"
|
|
test_names = [android_test_name]
|
|
action_flags_present_android_test(
|
|
name = android_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [link_action_mnemonic],
|
|
expected_flags = [no_undefined_flag],
|
|
)
|
|
|
|
# TODO(b/263787980): Uncomment when bionic toolchain is implemented
|
|
# bionic_test_name = name + "_when_bionic_test"
|
|
# test_names += [bionic_test_name]
|
|
# action_flags_present_linux_bionic_test(
|
|
# name = bionic_test_name,
|
|
# target_under_test = name,
|
|
# mnemonics = [link_action_mnemonic],
|
|
# expected_flags = [no_undefined_flag],
|
|
# )
|
|
|
|
# TODO(b/263787526): Uncomment when musl toolchain is implemented
|
|
# musl_test_name = name + "_when_musl_test"
|
|
# test_names += [musl_test_name]
|
|
# action_flags_present_musl_test(
|
|
# name = musl_test_name,
|
|
# target_under_test = name,
|
|
# mnemonics = [link_action_mnemonic],
|
|
# expected_flags = [no_undefined_flag],
|
|
# )
|
|
|
|
return test_names
|
|
|
|
# TODO(b/274924237): Uncomment after Darwin and Windows have toolchains
|
|
#def _test_undefined_flag_absent_when_windows_or_darwin():
|
|
# name = "no_undefined_flag_absent_when_windows_or_darwin"
|
|
#
|
|
# native.cc_binary(
|
|
# name = name,
|
|
# srcs = test_srcs,
|
|
# features = ["ubsan_undefined"],
|
|
# tags = ["manual"],
|
|
# )
|
|
#
|
|
# test_name = name + "_test"
|
|
# action_flags_absent_for_mnemonic_test(
|
|
# name = test_name,
|
|
# target_under_test = name,
|
|
# mnemonics = [compile_action_mnemonic],
|
|
# expected_absent_flags = [ubsan_prefix_format % "undefined"]
|
|
# target_compatible_with = [
|
|
# "//build/bazel/platforms/os:darwin",
|
|
# "//build/bazel/platforms/os:windows",
|
|
# ]
|
|
# )
|
|
#
|
|
# return test_name
|
|
|
|
def _test_no_undefined_flag_absent_when_not_bionic_or_musl():
|
|
name = "no_undefined_flag_absent_when_not_bionic_or_musl"
|
|
test_name = name + "_test"
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
action_flags_absent_linux_test(
|
|
name = test_name,
|
|
target_under_test = name,
|
|
mnemonics = [link_action_mnemonic],
|
|
expected_absent_flags = [no_undefined_flag],
|
|
)
|
|
|
|
return test_name
|
|
|
|
host_only_flags = ["-fno-sanitize-recover=all"]
|
|
|
|
def _test_host_only_features():
|
|
name = "host_only_features"
|
|
test_names = []
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
host_test_name = name + "_present_when_host_test"
|
|
test_names += [host_test_name]
|
|
action_flags_present_linux_test(
|
|
name = host_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_flags = host_only_flags,
|
|
)
|
|
|
|
device_test_name = name + "_absent_when_device_test"
|
|
test_names += [device_test_name]
|
|
action_flags_absent_android_test(
|
|
name = device_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_absent_flags = host_only_flags,
|
|
)
|
|
|
|
return test_names
|
|
|
|
device_only_flags = [
|
|
"-fsanitize-trap=all",
|
|
"-ftrap-function=abort",
|
|
]
|
|
|
|
def _test_device_only_features():
|
|
name = "device_only_features"
|
|
test_names = []
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
|
|
device_test_name = name + "_present_when_device_test"
|
|
test_names += [device_test_name]
|
|
action_flags_present_android_test(
|
|
name = device_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_flags = device_only_flags,
|
|
)
|
|
|
|
host_test_name = name + "_absent_when_host_test"
|
|
test_names += [host_test_name]
|
|
action_flags_absent_linux_test(
|
|
name = host_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_absent_flags = device_only_flags,
|
|
)
|
|
|
|
return test_names
|
|
|
|
def _test_device_only_and_host_only_features_absent_when_ubsan_disabled():
|
|
name = "device_only_and_host_only_features_absent_when_ubsan_disabled"
|
|
test_names = []
|
|
|
|
native.cc_binary(
|
|
name = name,
|
|
srcs = test_srcs,
|
|
tags = ["manual"],
|
|
)
|
|
|
|
host_test_name = name + "_host_test"
|
|
test_names += [host_test_name]
|
|
action_flags_absent_linux_test(
|
|
name = host_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_absent_flags = host_only_flags,
|
|
)
|
|
|
|
device_test_name = name + "_device_test"
|
|
test_names += [device_test_name]
|
|
action_flags_absent_android_test(
|
|
name = device_test_name,
|
|
target_under_test = name,
|
|
mnemonics = [compile_action_mnemonic],
|
|
expected_absent_flags = device_only_flags,
|
|
)
|
|
|
|
return test_names
|
|
|
|
_exclude_ubsan_rt_name = "ubsan_exclude_rt"
|
|
|
|
def _exclude_ubsan_rt_test_for_os_arch(os, arch, flag):
|
|
test_name = "%s_%s_test" % (
|
|
_exclude_ubsan_rt_name,
|
|
os + "_" + arch,
|
|
)
|
|
|
|
action_flags_present_only_for_mnemonic_test(
|
|
name = test_name,
|
|
target_under_test = _exclude_ubsan_rt_name,
|
|
mnemonics = [link_action_mnemonic],
|
|
expected_flags = [flag],
|
|
target_compatible_with = [
|
|
"//build/bazel/platforms/os:" + os,
|
|
"//build/bazel/platforms/arch:" + arch,
|
|
],
|
|
)
|
|
|
|
return test_name
|
|
|
|
def _test_exclude_ubsan_rt():
|
|
native.cc_binary(
|
|
name = _exclude_ubsan_rt_name,
|
|
srcs = test_srcs,
|
|
features = ["ubsan_undefined"],
|
|
tags = ["manual"],
|
|
)
|
|
test_cases = [
|
|
{
|
|
"os": "android",
|
|
"arch": "arm",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-arm-android.a",
|
|
},
|
|
{
|
|
"os": "android",
|
|
"arch": "arm64",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-aarch64-android.a",
|
|
},
|
|
{
|
|
"os": "android",
|
|
"arch": "x86",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-i686-android.a",
|
|
},
|
|
{
|
|
"os": "android",
|
|
"arch": "x86_64",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-x86_64-android.a",
|
|
},
|
|
{
|
|
"os": "linux_bionic",
|
|
"arch": "x86_64",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-x86_64-android.a",
|
|
},
|
|
{
|
|
"os": "linux",
|
|
"arch": "x86",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-i386.a",
|
|
},
|
|
{
|
|
"os": "linux",
|
|
"arch": "x86_64",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-x86_64.a",
|
|
},
|
|
{
|
|
"os": "linux_musl",
|
|
"arch": "x86",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-i386.a",
|
|
},
|
|
{
|
|
"os": "linux_musl",
|
|
"arch": "x86_64",
|
|
"flag": "-Wl,--exclude-libs=libclang_rt.ubsan_minimal-x86_64.a",
|
|
},
|
|
]
|
|
return [
|
|
_exclude_ubsan_rt_test_for_os_arch(**tc)
|
|
for tc in test_cases
|
|
]
|
|
|
|
def cc_toolchain_features_ubsan_test_suite(name):
|
|
individual_tests = [
|
|
_test_ubsan_misc_undefined_feature(),
|
|
_test_ubsan_implicit_integer_sign_change_disabled_when_linux_with_integer(),
|
|
_test_ubsan_implicit_integer_sign_change_not_disabled_when_specified(),
|
|
_test_ubsan_implicit_integer_sign_change_not_disabled_without_integer(),
|
|
_test_ubsan_unsigned_shift_base_disabled_when_linux_with_integer(),
|
|
_test_ubsan_unsigned_shift_base_not_disabled_when_specified(),
|
|
_test_ubsan_unsigned_shift_base_not_disabled_without_integer(),
|
|
_test_ubsan_unsupported_non_bionic_checks_disabled_when_linux(),
|
|
# TODO(b/263787980): Uncomment when bionic toolchain is implemented
|
|
# _test_ubsan_unsupported_non_bionic_checks_not_disabled_when_linux_bionic(),
|
|
_test_ubsan_unsupported_non_bionic_checks_not_disabled_when_android(),
|
|
_test_ubsan_unsupported_non_bionic_checks_not_disabled_when_no_ubsan(),
|
|
_test_ubsan_link_runtime_when_not_bionic_or_musl(),
|
|
# TODO(b/274924237): Uncomment after Darwin and Windows have toolchains
|
|
# _test_undefined_flag_absent_when_windows_or_darwin(),
|
|
]
|
|
native.test_suite(
|
|
name = name,
|
|
tests = individual_tests +
|
|
_test_ubsan_no_link_runtime() +
|
|
_test_no_undefined_flag_present_when_bionic_or_musl() +
|
|
_test_ubsan_integer_overflow_feature() +
|
|
_test_host_only_features() +
|
|
_test_device_only_features() +
|
|
_test_device_only_and_host_only_features_absent_when_ubsan_disabled() +
|
|
_test_exclude_ubsan_rt(),
|
|
)
|