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
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits