tatyana-krasnukha created this revision. tatyana-krasnukha added reviewers: ki.stfu, abidh. Herald added a subscriber: lldb-commits.
Prevent crashing like llvm.org/pr37054 Repository: rLLDB LLDB https://reviews.llvm.org/D55653 Files: MICmdCmdData.cpp MICmdCmdGdbInfo.cpp MICmdCmdMiscellanous.cpp MICmnLLDBDebugSessionInfo.cpp MIDataTypes.h
Index: MIDataTypes.h =================================================================== --- MIDataTypes.h +++ MIDataTypes.h @@ -62,3 +62,18 @@ // Fundamentals: typedef long long MIint64; // 64bit signed integer. typedef unsigned long long MIuint64; // 64bit unsigned integer. + +template <typename T> +class MIDereferencable { +public: + MIDereferencable(T *ptr) : m_ptr(ptr) {} + + T *Or(T &alt_value) { return m_ptr ? m_ptr : &alt_value; } +private: + T* m_ptr = nullptr; +}; + +template<typename T> +MIDereferencable<T> GetDereferencable(T *ptr) { + return MIDereferencable<T>(ptr); +} \ No newline at end of file Index: MICmnLLDBDebugSessionInfo.cpp =================================================================== --- MICmnLLDBDebugSessionInfo.cpp +++ MICmnLLDBDebugSessionInfo.cpp @@ -639,11 +639,10 @@ vwPc = rFrame.GetPC(); - const char *pFnName = rFrame.GetFunctionName(); - vwFnName = (pFnName != nullptr) ? pFnName : pUnkwn; + vwFnName = GetDereferencable(rFrame.GetFunctionName()).Or(*pUnkwn); - const char *pFileName = rFrame.GetLineEntry().GetFileSpec().GetFilename(); - vwFileName = (pFileName != nullptr) ? pFileName : pUnkwn; + vwFileName = GetDereferencable( + rFrame.GetLineEntry().GetFileSpec().GetFilename()).Or(*pUnkwn); vwnLine = rFrame.GetLineEntry().GetLine(); @@ -829,9 +828,9 @@ vrwBrkPtInfo.m_id = vBrkPt.GetID(); vrwBrkPtInfo.m_strType = "breakpoint"; vrwBrkPtInfo.m_pc = nAddr; - vrwBrkPtInfo.m_fnName = pFn; - vrwBrkPtInfo.m_fileName = pFile; - vrwBrkPtInfo.m_path = pFilePath; + vrwBrkPtInfo.m_fnName = GetDereferencable(pFn).Or(*pUnkwn); + vrwBrkPtInfo.m_fileName = GetDereferencable(pFile).Or(*pUnkwn); + vrwBrkPtInfo.m_path = GetDereferencable(pFilePath).Or(*pUnkwn); vrwBrkPtInfo.m_nLine = nLine; vrwBrkPtInfo.m_nTimes = vBrkPt.GetHitCount(); Index: MICmdCmdMiscellanous.cpp =================================================================== --- MICmdCmdMiscellanous.cpp +++ MICmdCmdMiscellanous.cpp @@ -336,9 +336,12 @@ } if (rSessionInfo.GetTarget().IsValid()) { + const char *pUnkwn = "??"; lldb::SBTarget sbTrgt = rSessionInfo.GetTarget(); - const char *pDir = sbTrgt.GetExecutable().GetDirectory(); - const char *pFileName = sbTrgt.GetExecutable().GetFilename(); + const char *pDir = + GetDereferencable(sbTrgt.GetExecutable().GetDirectory()).Or(*pUnkwn); + const char *pFileName = + GetDereferencable(sbTrgt.GetExecutable().GetFilename()).Or(*pUnkwn); const CMIUtilString strFile( CMIUtilString::Format("%s/%s", pDir, pFileName)); const CMICmnMIValueConst miValueConst4(strFile); Index: MICmdCmdGdbInfo.cpp =================================================================== --- MICmdCmdGdbInfo.cpp +++ MICmdCmdGdbInfo.cpp @@ -192,6 +192,8 @@ bool bOk = CMICmnStreamStdout::TextToStdout( "~\"From To Syms Read Shared Object Library\""); + const char *pUnknown = "??"; + CMICmnLLDBDebugSessionInfo &rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance()); lldb::SBTarget sbTarget = rSessionInfo.GetTarget(); @@ -199,9 +201,11 @@ for (MIuint i = 0; bOk && (i < nModules); i++) { lldb::SBModule module = sbTarget.GetModuleAtIndex(i); if (module.IsValid()) { + auto fileSpec = module.GetFileSpec(); const CMIUtilString strModuleFilePath( - module.GetFileSpec().GetDirectory()); - const CMIUtilString strModuleFileName(module.GetFileSpec().GetFilename()); + GetDereferencable(fileSpec.GetDirectory()).Or(*pUnknown)); + const CMIUtilString strModuleFileName( + GetDereferencable(fileSpec.GetFilename()).Or(*pUnknown)); const CMIUtilString strModuleFullPath(CMIUtilString::Format( "%s/%s", strModuleFilePath.c_str(), strModuleFileName.c_str())); const CMIUtilString strHasSymbols = Index: MICmdCmdData.cpp =================================================================== --- MICmdCmdData.cpp +++ MICmdCmdData.cpp @@ -373,8 +373,8 @@ for (size_t i = 0; i < nInstructions; i++) { const char *pUnknown = "??"; lldb::SBInstruction instrt = instructions.GetInstructionAtIndex(i); - const char *pStrMnemonic = instrt.GetMnemonic(sbTarget); - pStrMnemonic = (pStrMnemonic != nullptr) ? pStrMnemonic : pUnknown; + const char *pStrMnemonic = + GetDereferencable(instrt.GetMnemonic(sbTarget)).Or(*pUnknown); const char *pStrComment = instrt.GetComment(sbTarget); CMIUtilString strComment; if (pStrComment != nullptr && *pStrComment != '\0') @@ -381,11 +381,11 @@ strComment = CMIUtilString::Format("; %s", pStrComment); lldb::SBAddress address = instrt.GetAddress(); lldb::addr_t addr = address.GetLoadAddress(sbTarget); - const char *pFnName = address.GetFunction().GetName(); - pFnName = (pFnName != nullptr) ? pFnName : pUnknown; + const char *pFnName = + GetDereferencable(address.GetFunction().GetName()).Or(*pUnknown); lldb::addr_t addrOffSet = address.GetOffset() - start_offset; - const char *pStrOperands = instrt.GetOperands(sbTarget); - pStrOperands = (pStrOperands != nullptr) ? pStrOperands : pUnknown; + const char *pStrOperands = + GetDereferencable(instrt.GetOperands(sbTarget)).Or(*pUnknown); const size_t instrtSize = instrt.GetByteSize(); // MI "{address=\"0x%016" PRIx64 @@ -414,8 +414,8 @@ if (nDisasmMode == 1) { lldb::SBLineEntry lineEntry = address.GetLineEntry(); const MIuint nLine = lineEntry.GetLine(); - const char *pFileName = lineEntry.GetFileSpec().GetFilename(); - pFileName = (pFileName != nullptr) ? pFileName : pUnknown; + const char *pFileName = + GetDereferencable(lineEntry.GetFileSpec().GetFilename()).Or(*pUnknown); // MI "src_and_asm_line={line=\"%u\",file=\"%s\",line_asm_insn=[ ]}" const CMICmnMIValueConst miValueConst(
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits