diff options
author | Alexey Samsonov <vonosmas@gmail.com> | 2014-10-01 21:28:54 +0000 |
---|---|---|
committer | Alexey Samsonov <vonosmas@gmail.com> | 2014-10-01 21:28:54 +0000 |
commit | 1b42bde30d1ad0079ece80077eb92f70e3e6c589 (patch) | |
tree | ce2508d4b8f8677da3d9a49cd55a4ef444aff4db | |
parent | c3285a1dedc104797bfb78707c7bd693eb0cacc2 (diff) | |
download | llvm-1b42bde30d1ad0079ece80077eb92f70e3e6c589.zip llvm-1b42bde30d1ad0079ece80077eb92f70e3e6c589.tar.gz llvm-1b42bde30d1ad0079ece80077eb92f70e3e6c589.tar.bz2 |
[ASan] Don't use large stack buffer for local variable name in stack frame description
llvm-svn: 218827
-rw-r--r-- | compiler-rt/lib/asan/asan_report.cc | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/compiler-rt/lib/asan/asan_report.cc b/compiler-rt/lib/asan/asan_report.cc index 713e115..7dd1006 100644 --- a/compiler-rt/lib/asan/asan_report.cc +++ b/compiler-rt/lib/asan/asan_report.cc @@ -341,16 +341,15 @@ const char *ThreadNameWithParenthesis(u32 tid, char buff[], return ThreadNameWithParenthesis(t, buff, buff_len); } -void PrintAccessAndVarIntersection(const char *var_name, - uptr var_beg, uptr var_size, - uptr addr, uptr access_size, - uptr prev_var_end, uptr next_var_beg) { - uptr var_end = var_beg + var_size; +static void PrintAccessAndVarIntersection(const StackVarDescr &var, uptr addr, + uptr access_size, uptr prev_var_end, + uptr next_var_beg) { + uptr var_end = var.beg + var.size; uptr addr_end = addr + access_size; const char *pos_descr = 0; - // If the variable [var_beg, var_end) is the nearest variable to the + // If the variable [var.beg, var_end) is the nearest variable to the // current memory access, indicate it in the log. - if (addr >= var_beg) { + if (addr >= var.beg) { if (addr_end <= var_end) pos_descr = "is inside"; // May happen if this is a use-after-return. else if (addr < var_end) @@ -359,14 +358,20 @@ void PrintAccessAndVarIntersection(const char *var_name, next_var_beg - addr_end >= addr - var_end) pos_descr = "overflows"; } else { - if (addr_end > var_beg) + if (addr_end > var.beg) pos_descr = "partially underflows"; else if (addr >= prev_var_end && - addr - prev_var_end >= var_beg - addr_end) + addr - prev_var_end >= var.beg - addr_end) pos_descr = "underflows"; } InternalScopedString str(1024); - str.append(" [%zd, %zd) '%s'", var_beg, var_beg + var_size, var_name); + str.append(" [%zd, %zd)", var.beg, var_end); + // Render variable name. + str.append(" '"); + for (uptr i = 0; i < var.name_len; ++i) { + str.append("%c", var.name_pos[i]); + } + str.append("'"); if (pos_descr) { Decorator d; // FIXME: we may want to also print the size of the access here, @@ -455,16 +460,11 @@ bool DescribeAddressIfStack(uptr addr, uptr access_size) { Printf(" This frame has %zu object(s):\n", n_objects); // Report all objects in this frame. - const uptr kBufSize = 4095; - char buf[kBufSize]; for (uptr i = 0; i < n_objects; i++) { - buf[0] = 0; - internal_strncat(buf, vars[i].name_pos, - static_cast<uptr>(Min(kBufSize, vars[i].name_len))); uptr prev_var_end = i ? vars[i - 1].beg + vars[i - 1].size : 0; uptr next_var_beg = i + 1 < n_objects ? vars[i + 1].beg : ~(0UL); - PrintAccessAndVarIntersection(buf, vars[i].beg, vars[i].size, access.offset, - access_size, prev_var_end, next_var_beg); + PrintAccessAndVarIntersection(vars[i], access.offset, access_size, + prev_var_end, next_var_beg); } Printf("HINT: this may be a false positive if your program uses " "some custom stack unwind mechanism or swapcontext\n"); |