Home | History | Annotate | Line # | Download | only in asan
      1  1.1  mrg //===-- asan_suppressions.cpp ---------------------------------------------===//
      2  1.1  mrg //
      3  1.1  mrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4  1.1  mrg // See https://llvm.org/LICENSE.txt for license information.
      5  1.1  mrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6  1.1  mrg //
      7  1.1  mrg //===----------------------------------------------------------------------===//
      8  1.1  mrg //
      9  1.1  mrg // This file is a part of AddressSanitizer, an address sanity checker.
     10  1.1  mrg //
     11  1.1  mrg // Issue suppression and suppression-related functions.
     12  1.1  mrg //===----------------------------------------------------------------------===//
     13  1.1  mrg 
     14  1.1  mrg #include "asan_suppressions.h"
     15  1.1  mrg 
     16  1.1  mrg #include "asan_stack.h"
     17  1.1  mrg #include "sanitizer_common/sanitizer_placement_new.h"
     18  1.1  mrg #include "sanitizer_common/sanitizer_suppressions.h"
     19  1.1  mrg #include "sanitizer_common/sanitizer_symbolizer.h"
     20  1.1  mrg 
     21  1.1  mrg namespace __asan {
     22  1.1  mrg 
     23  1.1  mrg ALIGNED(64) static char suppression_placeholder[sizeof(SuppressionContext)];
     24  1.1  mrg static SuppressionContext *suppression_ctx = nullptr;
     25  1.1  mrg static const char kInterceptorName[] = "interceptor_name";
     26  1.1  mrg static const char kInterceptorViaFunction[] = "interceptor_via_fun";
     27  1.1  mrg static const char kInterceptorViaLibrary[] = "interceptor_via_lib";
     28  1.1  mrg static const char kODRViolation[] = "odr_violation";
     29  1.1  mrg static const char *kSuppressionTypes[] = {
     30  1.1  mrg     kInterceptorName, kInterceptorViaFunction, kInterceptorViaLibrary,
     31  1.1  mrg     kODRViolation};
     32  1.1  mrg 
     33  1.1  mrg SANITIZER_INTERFACE_WEAK_DEF(const char *, __asan_default_suppressions, void) {
     34  1.1  mrg   return "";
     35  1.1  mrg }
     36  1.1  mrg 
     37  1.1  mrg void InitializeSuppressions() {
     38  1.1  mrg   CHECK_EQ(nullptr, suppression_ctx);
     39  1.1  mrg   suppression_ctx = new (suppression_placeholder)
     40  1.1  mrg       SuppressionContext(kSuppressionTypes, ARRAY_SIZE(kSuppressionTypes));
     41  1.1  mrg   suppression_ctx->ParseFromFile(flags()->suppressions);
     42  1.1  mrg   if (&__asan_default_suppressions)
     43  1.1  mrg     suppression_ctx->Parse(__asan_default_suppressions());
     44  1.1  mrg }
     45  1.1  mrg 
     46  1.1  mrg bool IsInterceptorSuppressed(const char *interceptor_name) {
     47  1.1  mrg   CHECK(suppression_ctx);
     48  1.1  mrg   Suppression *s;
     49  1.1  mrg   // Match "interceptor_name" suppressions.
     50  1.1  mrg   return suppression_ctx->Match(interceptor_name, kInterceptorName, &s);
     51  1.1  mrg }
     52  1.1  mrg 
     53  1.1  mrg bool HaveStackTraceBasedSuppressions() {
     54  1.1  mrg   CHECK(suppression_ctx);
     55  1.1  mrg   return suppression_ctx->HasSuppressionType(kInterceptorViaFunction) ||
     56  1.1  mrg          suppression_ctx->HasSuppressionType(kInterceptorViaLibrary);
     57  1.1  mrg }
     58  1.1  mrg 
     59  1.1  mrg bool IsODRViolationSuppressed(const char *global_var_name) {
     60  1.1  mrg   CHECK(suppression_ctx);
     61  1.1  mrg   Suppression *s;
     62  1.1  mrg   // Match "odr_violation" suppressions.
     63  1.1  mrg   return suppression_ctx->Match(global_var_name, kODRViolation, &s);
     64  1.1  mrg }
     65  1.1  mrg 
     66  1.1  mrg bool IsStackTraceSuppressed(const StackTrace *stack) {
     67  1.1  mrg   if (!HaveStackTraceBasedSuppressions())
     68  1.1  mrg     return false;
     69  1.1  mrg 
     70  1.1  mrg   CHECK(suppression_ctx);
     71  1.1  mrg   Symbolizer *symbolizer = Symbolizer::GetOrInit();
     72  1.1  mrg   Suppression *s;
     73  1.1  mrg   for (uptr i = 0; i < stack->size && stack->trace[i]; i++) {
     74  1.1  mrg     uptr addr = stack->trace[i];
     75  1.1  mrg 
     76  1.1  mrg     if (suppression_ctx->HasSuppressionType(kInterceptorViaLibrary)) {
     77  1.1  mrg       // Match "interceptor_via_lib" suppressions.
     78  1.1  mrg       if (const char *module_name = symbolizer->GetModuleNameForPc(addr))
     79  1.1  mrg         if (suppression_ctx->Match(module_name, kInterceptorViaLibrary, &s))
     80  1.1  mrg           return true;
     81  1.1  mrg     }
     82  1.1  mrg 
     83  1.1  mrg     if (suppression_ctx->HasSuppressionType(kInterceptorViaFunction)) {
     84  1.1  mrg       SymbolizedStack *frames = symbolizer->SymbolizePC(addr);
     85  1.1  mrg       CHECK(frames);
     86  1.1  mrg       for (SymbolizedStack *cur = frames; cur; cur = cur->next) {
     87  1.1  mrg         const char *function_name = cur->info.function;
     88  1.1  mrg         if (!function_name) {
     89  1.1  mrg           continue;
     90  1.1  mrg         }
     91  1.1  mrg         // Match "interceptor_via_fun" suppressions.
     92  1.1  mrg         if (suppression_ctx->Match(function_name, kInterceptorViaFunction,
     93  1.1  mrg                                    &s)) {
     94  1.1  mrg           frames->ClearAll();
     95  1.1  mrg           return true;
     96  1.1  mrg         }
     97  1.1  mrg       }
     98  1.1  mrg       frames->ClearAll();
     99  1.1  mrg     }
    100  1.1  mrg   }
    101  1.1  mrg   return false;
    102  1.1  mrg }
    103  1.1  mrg 
    104  1.1  mrg } // namespace __asan
    105