Path: blob/main/contrib/llvm-project/compiler-rt/lib/nsan/nsan_suppressions.cpp
35233 views
//===-- nsan_suppressions.cc ----------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "nsan_suppressions.h"9#include "nsan_flags.h"10#include "sanitizer_common/sanitizer_placement_new.h"11#include "sanitizer_common/sanitizer_stacktrace.h"12#include "sanitizer_common/sanitizer_symbolizer.h"1314using namespace __sanitizer;15using namespace __nsan;1617SANITIZER_INTERFACE_WEAK_DEF(const char *, __nsan_default_suppressions, void) {18return 0;19}2021const char kSuppressionFcmp[] = "fcmp";22const char kSuppressionConsistency[] = "consistency";2324alignas(64) static char suppression_placeholder[sizeof(SuppressionContext)];25static SuppressionContext *suppression_ctx;2627// The order should match the enum CheckKind.28static const char *kSuppressionTypes[] = {kSuppressionFcmp,29kSuppressionConsistency};3031void __nsan::InitializeSuppressions() {32CHECK_EQ(nullptr, suppression_ctx);33suppression_ctx = new (suppression_placeholder)34SuppressionContext(kSuppressionTypes, ARRAY_SIZE(kSuppressionTypes));35suppression_ctx->ParseFromFile(flags().suppressions);36suppression_ctx->Parse(__nsan_default_suppressions());37}3839static Suppression *GetSuppressionForAddr(uptr addr, const char *suppr_type) {40Suppression *s = nullptr;4142// Suppress by module name.43SuppressionContext *suppressions = suppression_ctx;44if (const char *moduleName =45Symbolizer::GetOrInit()->GetModuleNameForPc(addr)) {46if (suppressions->Match(moduleName, suppr_type, &s))47return s;48}4950// Suppress by file or function name.51SymbolizedStack *frames = Symbolizer::GetOrInit()->SymbolizePC(addr);52for (SymbolizedStack *cur = frames; cur; cur = cur->next) {53if (suppressions->Match(cur->info.function, suppr_type, &s) ||54suppressions->Match(cur->info.file, suppr_type, &s)) {55break;56}57}58frames->ClearAll();59return s;60}6162Suppression *__nsan::GetSuppressionForStack(const StackTrace *stack,63CheckKind k) {64for (uptr i = 0, e = stack->size; i < e; i++) {65Suppression *s = GetSuppressionForAddr(66StackTrace::GetPreviousInstructionPc(stack->trace[i]),67kSuppressionTypes[static_cast<int>(k)]);68if (s)69return s;70}71return nullptr;72}737475