| Kostya Serebryany | 4a42cf6 | 2012-12-27 14:09:19 +0000 | [diff] [blame] | 1 | //===-- msan_report.cc ----------------------------------------------------===// | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file is a part of MemorySanitizer. | 
|  | 11 | // | 
|  | 12 | // Error reporting. | 
|  | 13 | //===----------------------------------------------------------------------===// | 
|  | 14 |  | 
|  | 15 | #include "msan.h" | 
| Alexey Samsonov | c30e2d6 | 2013-05-29 09:15:39 +0000 | [diff] [blame] | 16 | #include "sanitizer_common/sanitizer_allocator_internal.h" | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 17 | #include "sanitizer_common/sanitizer_common.h" | 
| Sergey Matveev | 6eff11e | 2013-05-06 13:15:14 +0000 | [diff] [blame] | 18 | #include "sanitizer_common/sanitizer_flags.h" | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 19 | #include "sanitizer_common/sanitizer_mutex.h" | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 20 | #include "sanitizer_common/sanitizer_report_decorator.h" | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 21 | #include "sanitizer_common/sanitizer_stackdepot.h" | 
| Kostya Serebryany | 7b0b9b3 | 2013-02-07 08:04:56 +0000 | [diff] [blame] | 22 | #include "sanitizer_common/sanitizer_symbolizer.h" | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 23 |  | 
|  | 24 | using namespace __sanitizer; | 
|  | 25 |  | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 26 | namespace __msan { | 
|  | 27 |  | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 28 | class Decorator: private __sanitizer::AnsiColorDecorator { | 
|  | 29 | public: | 
|  | 30 | Decorator() : __sanitizer::AnsiColorDecorator(PrintsToTtyCached()) { } | 
|  | 31 | const char *Warning()    { return Red(); } | 
|  | 32 | const char *Origin()     { return Magenta(); } | 
|  | 33 | const char *Name()   { return Green(); } | 
|  | 34 | const char *End()    { return Default(); } | 
|  | 35 | }; | 
|  | 36 |  | 
| Kostya Serebryany | ec87e78 | 2013-02-13 07:19:47 +0000 | [diff] [blame] | 37 | static void PrintStack(const uptr *trace, uptr size) { | 
|  | 38 | SymbolizerScope sym_scope; | 
| Sergey Matveev | 6eff11e | 2013-05-06 13:15:14 +0000 | [diff] [blame] | 39 | StackTrace::PrintStack(trace, size, true, | 
|  | 40 | common_flags()->strip_path_prefix, 0); | 
| Kostya Serebryany | ec87e78 | 2013-02-13 07:19:47 +0000 | [diff] [blame] | 41 | } | 
|  | 42 |  | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 43 | static void DescribeOrigin(u32 origin) { | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 44 | Decorator d; | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 45 | if (flags()->verbosity) | 
|  | 46 | Printf("  raw origin id: %d\n", origin); | 
|  | 47 | if (const char *so = __msan_get_origin_descr_if_stack(origin)) { | 
|  | 48 | char* s = internal_strdup(so); | 
|  | 49 | char* sep = internal_strchr(s, '@'); | 
|  | 50 | CHECK(sep); | 
|  | 51 | *sep = '\0'; | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 52 | Printf("%s", d.Origin()); | 
| Evgeniy Stepanov | 257274e | 2013-02-11 11:34:26 +0000 | [diff] [blame] | 53 | Printf("  %sUninitialized value was created by an allocation of '%s%s%s'" | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 54 | " in the stack frame of function '%s%s%s'%s\n", | 
| Alexey Samsonov | 7a36e61 | 2013-09-10 14:36:16 +0000 | [diff] [blame^] | 55 | d.Origin(), d.Name(), s, d.Origin(), d.Name(), | 
|  | 56 | getSymbolizer()->Demangle(sep + 1), d.Origin(), d.End()); | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 57 | InternalFree(s); | 
|  | 58 | } else { | 
|  | 59 | uptr size = 0; | 
|  | 60 | const uptr *trace = StackDepotGet(origin, &size); | 
| Evgeniy Stepanov | 257274e | 2013-02-11 11:34:26 +0000 | [diff] [blame] | 61 | Printf("  %sUninitialized value was created by a heap allocation%s\n", | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 62 | d.Origin(), d.End()); | 
| Kostya Serebryany | ec87e78 | 2013-02-13 07:19:47 +0000 | [diff] [blame] | 63 | PrintStack(trace, size); | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 64 | } | 
|  | 65 | } | 
|  | 66 |  | 
| Kostya Serebryany | 7b0b9b3 | 2013-02-07 08:04:56 +0000 | [diff] [blame] | 67 | static void ReportSummary(const char *error_type, StackTrace *stack) { | 
| Alexey Samsonov | 7a36e61 | 2013-09-10 14:36:16 +0000 | [diff] [blame^] | 68 | if (!stack->size || !getSymbolizer()->IsAvailable()) return; | 
| Kostya Serebryany | 7b0b9b3 | 2013-02-07 08:04:56 +0000 | [diff] [blame] | 69 | AddressInfo ai; | 
| Alexey Samsonov | 93686fc | 2013-02-12 10:46:39 +0000 | [diff] [blame] | 70 | uptr pc = StackTrace::GetPreviousInstructionPc(stack->trace[0]); | 
| Kostya Serebryany | ec87e78 | 2013-02-13 07:19:47 +0000 | [diff] [blame] | 71 | { | 
|  | 72 | SymbolizerScope sym_scope; | 
| Alexey Samsonov | 7a36e61 | 2013-09-10 14:36:16 +0000 | [diff] [blame^] | 73 | getSymbolizer()->SymbolizeCode(pc, &ai, 1); | 
| Kostya Serebryany | ec87e78 | 2013-02-13 07:19:47 +0000 | [diff] [blame] | 74 | } | 
| Kostya Serebryany | 7b0b9b3 | 2013-02-07 08:04:56 +0000 | [diff] [blame] | 75 | ReportErrorSummary(error_type, | 
| Sergey Matveev | 6eff11e | 2013-05-06 13:15:14 +0000 | [diff] [blame] | 76 | StripPathPrefix(ai.file, | 
|  | 77 | common_flags()->strip_path_prefix), | 
| Kostya Serebryany | 7b0b9b3 | 2013-02-07 08:04:56 +0000 | [diff] [blame] | 78 | ai.line, ai.function); | 
|  | 79 | } | 
|  | 80 |  | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 81 | void ReportUMR(StackTrace *stack, u32 origin) { | 
|  | 82 | if (!__msan::flags()->report_umrs) return; | 
|  | 83 |  | 
| Alexey Samsonov | 734aab4 | 2013-04-05 07:30:29 +0000 | [diff] [blame] | 84 | SpinMutexLock l(&CommonSanitizerReportMutex); | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 85 |  | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 86 | Decorator d; | 
|  | 87 | Printf("%s", d.Warning()); | 
| Evgeniy Stepanov | dd0780f | 2013-05-28 14:27:30 +0000 | [diff] [blame] | 88 | Report(" WARNING: MemorySanitizer: use-of-uninitialized-value\n"); | 
| Evgeniy Stepanov | fee82c6 | 2012-12-26 10:16:45 +0000 | [diff] [blame] | 89 | Printf("%s", d.End()); | 
| Kostya Serebryany | ec87e78 | 2013-02-13 07:19:47 +0000 | [diff] [blame] | 90 | PrintStack(stack->trace, stack->size); | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 91 | if (origin) { | 
|  | 92 | DescribeOrigin(origin); | 
|  | 93 | } | 
| Kostya Serebryany | 7b0b9b3 | 2013-02-07 08:04:56 +0000 | [diff] [blame] | 94 | ReportSummary("use-of-uninitialized-value", stack); | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 95 | } | 
|  | 96 |  | 
|  | 97 | void ReportExpectedUMRNotFound(StackTrace *stack) { | 
| Alexey Samsonov | 734aab4 | 2013-04-05 07:30:29 +0000 | [diff] [blame] | 98 | SpinMutexLock l(&CommonSanitizerReportMutex); | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 99 |  | 
|  | 100 | Printf(" WARNING: Expected use of uninitialized value not found\n"); | 
| Kostya Serebryany | ec87e78 | 2013-02-13 07:19:47 +0000 | [diff] [blame] | 101 | PrintStack(stack->trace, stack->size); | 
| Evgeniy Stepanov | 367dc64 | 2012-12-26 09:32:05 +0000 | [diff] [blame] | 102 | } | 
|  | 103 |  | 
| Evgeniy Stepanov | 9b52ce9 | 2013-01-10 11:17:55 +0000 | [diff] [blame] | 104 | void ReportAtExitStatistics() { | 
| Alexey Samsonov | 734aab4 | 2013-04-05 07:30:29 +0000 | [diff] [blame] | 105 | SpinMutexLock l(&CommonSanitizerReportMutex); | 
|  | 106 |  | 
| Evgeniy Stepanov | 9b52ce9 | 2013-01-10 11:17:55 +0000 | [diff] [blame] | 107 | Decorator d; | 
|  | 108 | Printf("%s", d.Warning()); | 
|  | 109 | Printf("MemorySanitizer: %d warnings reported.\n", msan_report_count); | 
|  | 110 | Printf("%s", d.End()); | 
|  | 111 | } | 
|  | 112 |  | 
| Alexey Samsonov | 49a32c1 | 2013-01-30 07:45:58 +0000 | [diff] [blame] | 113 | }  // namespace __msan |