From: Zachary Turner Date: Mon, 12 Jun 2017 20:46:35 +0000 (+0000) Subject: Fix a null pointer dereference in llvm-pdbutil pretty. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bd6d1e94a1b6745a2d0f6e31d709dba2b21a1b65;p=llvm Fix a null pointer dereference in llvm-pdbutil pretty. Static data members were causing a problem because I mistakenly assumed all members would affect a class's layout and so the Layout member would be non-null. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305229 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/DebugInfo/PDB/UDTLayout.cpp b/lib/DebugInfo/PDB/UDTLayout.cpp index aacefae80c3..da353cb6977 100644 --- a/lib/DebugInfo/PDB/UDTLayout.cpp +++ b/lib/DebugInfo/PDB/UDTLayout.cpp @@ -181,13 +181,14 @@ void UDTLayoutBase::initializeChildren(const PDBSymbol &Sym) { if (Data->getDataKind() == PDB_DataKind::Member) Members.push_back(std::move(Data)); else - Other.push_back(std::move(Child)); + Other.push_back(std::move(Data)); } else if (auto VT = unique_dyn_cast(Child)) VTables.push_back(std::move(VT)); else if (auto Func = unique_dyn_cast(Child)) Funcs.push_back(std::move(Func)); - else + else { Other.push_back(std::move(Child)); + } } // We don't want to have any re-allocations in the list of bases, so make diff --git a/tools/llvm-pdbutil/PrettyClassLayoutGraphicalDumper.cpp b/tools/llvm-pdbutil/PrettyClassLayoutGraphicalDumper.cpp index 54e33683f55..66c29fc5d4e 100644 --- a/tools/llvm-pdbutil/PrettyClassLayoutGraphicalDumper.cpp +++ b/tools/llvm-pdbutil/PrettyClassLayoutGraphicalDumper.cpp @@ -151,21 +151,21 @@ bool PrettyClassLayoutGraphicalDumper::shouldRecurse() const { } void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolData &Symbol) { - assert(CurrentItem != nullptr); - - DataMemberLayoutItem &Layout = - static_cast(*CurrentItem); - VariableDumper VarDumper(Printer); VarDumper.start(Symbol, ClassOffsetZero); - if (Layout.hasUDTLayout() && shouldRecurse()) { - uint32_t ChildOffsetZero = ClassOffsetZero + Layout.getOffsetInParent(); - Printer.Indent(); - PrettyClassLayoutGraphicalDumper TypeDumper(Printer, RecursionLevel + 1, - ChildOffsetZero); - TypeDumper.start(Layout.getUDTLayout()); - Printer.Unindent(); + if (CurrentItem != nullptr) { + DataMemberLayoutItem &Layout = + static_cast(*CurrentItem); + + if (Layout.hasUDTLayout() && shouldRecurse()) { + uint32_t ChildOffsetZero = ClassOffsetZero + Layout.getOffsetInParent(); + Printer.Indent(); + PrettyClassLayoutGraphicalDumper TypeDumper(Printer, RecursionLevel + 1, + ChildOffsetZero); + TypeDumper.start(Layout.getUDTLayout()); + Printer.Unindent(); + } } DumpedAnything = true;