From: Joel Rosdahl Date: Sat, 4 Apr 2026 19:05:52 +0000 (+0200) Subject: compat: Add knowledge of -fsanitize-ignorelist X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=972a0cbbafbecaf8bb5737a2c9674648654b89cd;p=thirdparty%2Fccache.git compat: Add knowledge of -fsanitize-ignorelist -fsanitize-blacklist was renamed to -fsanitize-ignorelist in Clang 13. Fixes #1712. --- diff --git a/src/ccache/argprocessing.cpp b/src/ccache/argprocessing.cpp index a130e907..fbb4a8b1 100644 --- a/src/ccache/argprocessing.cpp +++ b/src/ccache/argprocessing.cpp @@ -1014,11 +1014,13 @@ process_option_arg(const Context& ctx, return Statistic::none; } - if (arg.starts_with("-fsanitize-blacklist=")) { - auto path = std::string_view(args[i]).substr(21); - args_info.sanitize_blacklists.emplace_back(path); - auto relpath = core::make_relative_path(ctx, path); - state.add_common_arg(FMT("-fsanitize-blacklist={}", relpath)); + if (arg.starts_with("-fsanitize-ignorelist=") + || arg.starts_with("-fsanitize-blacklist=")) { + auto [option, path] = util::split_once(args[i], '='); + DEBUG_ASSERT(path); + args_info.sanitize_ignorelists.emplace_back(*path); + auto relpath = core::make_relative_path(ctx, *path); + state.add_common_arg(FMT("{}={}", option, relpath)); return Statistic::none; } diff --git a/src/ccache/argsinfo.hpp b/src/ccache/argsinfo.hpp index d17051d1..83c2a6d1 100644 --- a/src/ccache/argsinfo.hpp +++ b/src/ccache/argsinfo.hpp @@ -154,8 +154,8 @@ struct ArgsInfo // header it generates. bool fno_pch_timestamp = false; - // Files referenced by -fsanitize-blacklist options. - std::vector sanitize_blacklists; + // Files referenced by -fsanitize-ignorelist/-fsanitize-blacklist options. + std::vector sanitize_ignorelists; // Architectures from -arch options. std::vector arch_args; diff --git a/src/ccache/ccache.cpp b/src/ccache/ccache.cpp index 3881bdd0..6338ae05 100644 --- a/src/ccache/ccache.cpp +++ b/src/ccache/ccache.cpp @@ -1860,11 +1860,11 @@ hash_common_info(const Context& ctx, const util::Args& args, Hash& hash) hash.hash(gcda_path); } - // Possibly hash the sanitize blacklist file path. - for (const auto& sanitize_blacklist : ctx.args_info.sanitize_blacklists) { - LOG("Hashing sanitize blacklist {}", sanitize_blacklist); - hash.hash_delimiter("sanitizeblacklist"); - if (!hash_binary_file(ctx, hash, sanitize_blacklist)) { + // Possibly hash the sanitize ignorelist file path. + for (const auto& sanitize_ignorelist : ctx.args_info.sanitize_ignorelists) { + LOG("Hashing sanitize ignorelist {}", sanitize_ignorelist); + hash.hash_delimiter("sanitizeignorelist"); + if (!hash_binary_file(ctx, hash, sanitize_ignorelist)) { return tl::unexpected(Statistic::error_hashing_extra_file); } } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3c9c0314..40e7c969 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -62,7 +62,7 @@ addtest(remote_only) addtest(remote_redis) addtest(remote_redis_unix) addtest(remote_url) -addtest(sanitize_blacklist) +addtest(sanitize_ignorelist) addtest(serialize_diagnostics) addtest(source_date_epoch) addtest(split_dwarf) diff --git a/test/suites/sanitize_blacklist.bash b/test/suites/sanitize_blacklist.bash deleted file mode 100644 index 61f88c50..00000000 --- a/test/suites/sanitize_blacklist.bash +++ /dev/null @@ -1,119 +0,0 @@ -SUITE_sanitize_blacklist_PROBE() { - touch test.c blacklist.txt - if ! $COMPILER -c -fsanitize-blacklist=blacklist.txt \ - test.c 2>/dev/null; then - echo "-fsanitize-blacklist not supported by compiler" - fi -} - -SUITE_sanitize_blacklist_SETUP() { - generate_code 2 test1.c - echo "fun:foo" >blacklist.txt - echo "fun_1:foo" >blacklist2.txt - - mkdir -p dir1/ dir2/ - cp blacklist.txt dir1/blacklist.txt - cp blacklist.txt dir2/blacklist.txt - - unset CCACHE_NODIRECT -} - -SUITE_sanitize_blacklist() { - # ------------------------------------------------------------------------- - TEST "Compile OK" - - $COMPILER -c -fsanitize-blacklist=blacklist.txt test1.c - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 0 - expect_stat cache_miss 1 - expect_stat files_in_cache 2 - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 1 - expect_stat cache_miss 1 - expect_stat files_in_cache 2 - - echo "fun:bar" >blacklist.txt - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 1 - expect_stat cache_miss 2 - expect_stat files_in_cache 4 - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 2 - expect_stat cache_miss 2 - expect_stat files_in_cache 4 - - # ------------------------------------------------------------------------- - TEST "base_dir OK" - - basedir1="$(pwd)/dir1" - basedir2="$(pwd)/dir2" - - basedir=$basedir1 - cd $basedir - - $COMPILER -c -fsanitize-blacklist=blacklist.txt ../test1.c - - CCACHE_BASEDIR="${basedir}" $CCACHE_COMPILE -c -fsanitize-blacklist=$basedir/blacklist.txt ../test1.c - expect_stat direct_cache_hit 0 - expect_stat cache_miss 1 - expect_stat files_in_cache 2 - - CCACHE_BASEDIR="${basedir}" $CCACHE_COMPILE -c -fsanitize-blacklist=$basedir/blacklist.txt ../test1.c - expect_stat direct_cache_hit 1 - expect_stat cache_miss 1 - expect_stat files_in_cache 2 - - basedir=$basedir2 - cd $basedir - - CCACHE_DEBUG=1 CCACHE_BASEDIR="${basedir}" $CCACHE_COMPILE -c -fsanitize-blacklist=$basedir/blacklist.txt ../test1.c - expect_stat direct_cache_hit 2 - expect_stat cache_miss 1 - expect_stat files_in_cache 2 - - # ------------------------------------------------------------------------- - TEST "Unsuccessful compilation" - - if $COMPILER -c -fsanitize-blacklist=nosuchfile.txt test1.c 2>expected.stderr; then - test_failed "Expected an error compiling test1.c" - fi - - rm blacklist.txt - - if $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist.txt test1.c 2>expected.stderr; then - test_failed "Expected an error compiling test1.c" - fi - - expect_stat error_hashing_extra_file 1 - - # ------------------------------------------------------------------------- - TEST "Multiple -fsanitize-blacklist" - - $COMPILER -c -fsanitize-blacklist=blacklist2.txt -fsanitize-blacklist=blacklist.txt test1.c - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist2.txt -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 0 - expect_stat cache_miss 1 - expect_stat files_in_cache 2 - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist2.txt -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 1 - expect_stat cache_miss 1 - expect_stat files_in_cache 2 - - echo "fun_2:foo" >blacklist2.txt - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist2.txt -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 1 - expect_stat cache_miss 2 - expect_stat files_in_cache 4 - - $CCACHE_COMPILE -c -fsanitize-blacklist=blacklist2.txt -fsanitize-blacklist=blacklist.txt test1.c - expect_stat direct_cache_hit 2 - expect_stat cache_miss 2 - expect_stat files_in_cache 4 -} diff --git a/test/suites/sanitize_ignorelist.bash b/test/suites/sanitize_ignorelist.bash new file mode 100644 index 00000000..b7e595c1 --- /dev/null +++ b/test/suites/sanitize_ignorelist.bash @@ -0,0 +1,146 @@ +SUITE_sanitize_ignorelist_PROBE() { + touch test.c ignorelist.txt + if ! $COMPILER -c -fsanitize-ignorelist=ignorelist.txt \ + test.c 2>/dev/null; then + echo "-fsanitize-ignorelist not supported by compiler" + fi +} + +SUITE_sanitize_ignorelist_SETUP() { + generate_code 2 test1.c + echo "fun:foo" >ignorelist.txt + echo "fun_1:foo" >ignorelist2.txt + + mkdir -p dir1/ dir2/ + cp ignorelist.txt dir1/ignorelist.txt + cp ignorelist.txt dir2/ignorelist.txt + + unset CCACHE_NODIRECT +} + +SUITE_sanitize_ignorelist() { + # ------------------------------------------------------------------------- + TEST "Compile OK, -fsanitize-ignorelist" + + $COMPILER -c -fsanitize-ignorelist=ignorelist.txt test1.c + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 0 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 1 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + echo "fun:bar" >ignorelist.txt + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 1 + expect_stat cache_miss 2 + expect_stat files_in_cache 4 + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 2 + expect_stat cache_miss 2 + expect_stat files_in_cache 4 + + # ------------------------------------------------------------------------- + TEST "Compile OK, -fsanitize-blacklist" + + $COMPILER -c -fsanitize-blacklist=ignorelist.txt test1.c + + $CCACHE_COMPILE -c -fsanitize-blacklist=ignorelist.txt test1.c + expect_stat direct_cache_hit 0 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + $CCACHE_COMPILE -c -fsanitize-blacklist=ignorelist.txt test1.c + expect_stat direct_cache_hit 1 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + echo "fun:bar" >ignorelist.txt + + $CCACHE_COMPILE -c -fsanitize-blacklist=ignorelist.txt test1.c + expect_stat direct_cache_hit 1 + expect_stat cache_miss 2 + expect_stat files_in_cache 4 + + $CCACHE_COMPILE -c -fsanitize-blacklist=ignorelist.txt test1.c + expect_stat direct_cache_hit 2 + expect_stat cache_miss 2 + expect_stat files_in_cache 4 + + # ------------------------------------------------------------------------- + TEST "base_dir OK" + + basedir1="$(pwd)/dir1" + basedir2="$(pwd)/dir2" + + basedir=$basedir1 + cd $basedir + + $COMPILER -c -fsanitize-ignorelist=ignorelist.txt ../test1.c + + CCACHE_BASEDIR="${basedir}" $CCACHE_COMPILE -c -fsanitize-ignorelist=$basedir/ignorelist.txt ../test1.c + expect_stat direct_cache_hit 0 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + CCACHE_BASEDIR="${basedir}" $CCACHE_COMPILE -c -fsanitize-ignorelist=$basedir/ignorelist.txt ../test1.c + expect_stat direct_cache_hit 1 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + basedir=$basedir2 + cd $basedir + + CCACHE_DEBUG=1 CCACHE_BASEDIR="${basedir}" $CCACHE_COMPILE -c -fsanitize-ignorelist=$basedir/ignorelist.txt ../test1.c + expect_stat direct_cache_hit 2 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + # ------------------------------------------------------------------------- + TEST "Unsuccessful compilation" + + if $COMPILER -c -fsanitize-ignorelist=nosuchfile.txt test1.c 2>expected.stderr; then + test_failed "Expected an error compiling test1.c" + fi + + rm ignorelist.txt + + if $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist.txt test1.c 2>expected.stderr; then + test_failed "Expected an error compiling test1.c" + fi + + expect_stat error_hashing_extra_file 1 + + # ------------------------------------------------------------------------- + TEST "Multiple -fsanitize-ignorelist" + + $COMPILER -c -fsanitize-ignorelist=ignorelist2.txt -fsanitize-ignorelist=ignorelist.txt test1.c + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist2.txt -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 0 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist2.txt -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 1 + expect_stat cache_miss 1 + expect_stat files_in_cache 2 + + echo "fun_2:foo" >ignorelist2.txt + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist2.txt -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 1 + expect_stat cache_miss 2 + expect_stat files_in_cache 4 + + $CCACHE_COMPILE -c -fsanitize-ignorelist=ignorelist2.txt -fsanitize-ignorelist=ignorelist.txt test1.c + expect_stat direct_cache_hit 2 + expect_stat cache_miss 2 + expect_stat files_in_cache 4 +}