From 2f57c3a95f5ce5e94bb0f9b355436da4d0b233f2 Mon Sep 17 00:00:00 2001 From: Lucian Grijincu Date: Thu, 15 Oct 2015 19:17:30 -0700 Subject: [PATCH] folly: Symbolizer: don't allocate from function which is supposed to be signal safe Reviewed By: @philippv, @dcolascione Differential Revision: D2548023 fb-gh-sync-id: d2b0571d5db03e38ed17a5de6a13d2194a05b2b9 --- folly/experimental/symbolizer/Symbolizer.cpp | 19 +++-------- folly/experimental/symbolizer/Symbolizer.h | 34 +++++++++++++------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/folly/experimental/symbolizer/Symbolizer.cpp b/folly/experimental/symbolizer/Symbolizer.cpp index f7e8e602..cc98c124 100644 --- a/folly/experimental/symbolizer/Symbolizer.cpp +++ b/folly/experimental/symbolizer/Symbolizer.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #ifdef __GNUC__ #include @@ -266,6 +265,8 @@ constexpr auto kFileColor = SymbolizePrinter::Color::DEFAULT; } // namespace constexpr char AddressFormatter::bufTemplate[]; +constexpr std::array + SymbolizePrinter::kColorMap; AddressFormatter::AddressFormatter() { memcpy(buf_, bufTemplate, sizeof(buf_)); @@ -348,26 +349,14 @@ void SymbolizePrinter::print(uintptr_t address, const SymbolizedFrame& frame) { } void SymbolizePrinter::color(SymbolizePrinter::Color color) { - static const std::map kColorMap = { - { SymbolizePrinter::Color::DEFAULT, "\x1B[0m" }, - { SymbolizePrinter::Color::RED, "\x1B[31m" }, - { SymbolizePrinter::Color::GREEN, "\x1B[32m" }, - { SymbolizePrinter::Color::YELLOW, "\x1B[33m" }, - { SymbolizePrinter::Color::BLUE, "\x1B[34m" }, - { SymbolizePrinter::Color::CYAN, "\x1B[36m" }, - { SymbolizePrinter::Color::WHITE, "\x1B[37m" }, - { SymbolizePrinter::Color::PURPLE, "\x1B[35m" }, - }; - if ((options_ & COLOR) == 0 && ((options_ & COLOR_IF_TTY) == 0 || !isTty_)) { return; } - auto it = kColorMap.find(color); - if (it == kColorMap.end()) { + if (color < 0 || color >= kColorMap.size()) { return; } - doPrint(it->second); + doPrint(kColorMap[color]); } void SymbolizePrinter::println(uintptr_t address, diff --git a/folly/experimental/symbolizer/Symbolizer.h b/folly/experimental/symbolizer/Symbolizer.h index 4c30fa79..d8060330 100644 --- a/folly/experimental/symbolizer/Symbolizer.h +++ b/folly/experimental/symbolizer/Symbolizer.h @@ -17,9 +17,10 @@ #ifndef FOLLY_EXPERIMENTAL_SYMBOLIZER_SYMBOLIZER_H_ #define FOLLY_EXPERIMENTAL_SYMBOLIZER_SYMBOLIZER_H_ +#include #include +#include #include -#include #include #include @@ -39,14 +40,13 @@ class Symbolizer; * Frame information: symbol name and location. */ struct SymbolizedFrame { - SymbolizedFrame() : found(false), name(nullptr) { } + SymbolizedFrame() { } void set(const std::shared_ptr& file, uintptr_t address); void clear() { *this = SymbolizedFrame(); } - bool isSignalFrame; - bool found; - const char* name; + bool found = false; + const char* name = nullptr; Dwarf::LocationInfo location; /** @@ -61,9 +61,9 @@ struct SymbolizedFrame { template struct FrameArray { - FrameArray() : frameCount(0) { } + FrameArray() { } - size_t frameCount; + size_t frameCount = 0; uintptr_t addresses[N]; SymbolizedFrame frames[N]; }; @@ -131,7 +131,7 @@ class Symbolizer { } private: - ElfCacheBase* cache_; + ElfCacheBase* const cache_ = nullptr; }; /** @@ -206,7 +206,8 @@ class SymbolizePrinter { COLOR_IF_TTY = 1 << 3, }; - enum Color { DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, WHITE, PURPLE }; + // NOTE: enum values used as indexes in kColorMap. + enum Color { DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, WHITE, PURPLE, NUM }; void color(Color c); protected: @@ -221,6 +222,17 @@ class SymbolizePrinter { private: void printTerse(uintptr_t address, const SymbolizedFrame& frame); virtual void doPrint(StringPiece sp) = 0; + + static constexpr std::array kColorMap = {{ + "\x1B[0m", + "\x1B[31m", + "\x1B[32m", + "\x1B[33m", + "\x1B[34m", + "\x1B[36m", + "\x1B[37m", + "\x1B[35m", + }}; }; /** @@ -248,7 +260,7 @@ class FDSymbolizePrinter : public SymbolizePrinter { private: void doPrint(StringPiece sp) override; - int fd_; + const int fd_; std::unique_ptr buffer_; }; @@ -261,7 +273,7 @@ class FILESymbolizePrinter : public SymbolizePrinter { explicit FILESymbolizePrinter(FILE* file, int options=0); private: void doPrint(StringPiece sp) override; - FILE* file_; + FILE* const file_ = nullptr; }; /** -- 2.34.1