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

Reply via email to