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