forked from OSchip/llvm-project
[lldb] Make Process and subclass constructors protected
Make constructors of the Process and its subclasses class protected, to prevent accidentally constructing Process on stack when it could be afterwards accessed via a shared_ptr (since it uses std::enable_shared_from_this<>). The only place where a stack allocation was used were unittests, and fixing them via declaring an explicit public constructor in the respective mock classes is trivial. Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.llvm.org/D131275
This commit is contained in:
parent
e640250454
commit
9b031d5e3a
|
@ -21,9 +21,9 @@ namespace lldb_private {
|
|||
/// between these kinds of processes can have default implementations in this
|
||||
/// class.
|
||||
class PostMortemProcess : public Process {
|
||||
public:
|
||||
using Process::Process;
|
||||
|
||||
public:
|
||||
bool IsLiveDebugSession() const override { return false; }
|
||||
};
|
||||
|
||||
|
|
|
@ -475,15 +475,6 @@ public:
|
|||
const ProcessEventData &operator=(const ProcessEventData &) = delete;
|
||||
};
|
||||
|
||||
/// Construct with a shared pointer to a target, and the Process listener.
|
||||
/// Uses the Host UnixSignalsSP by default.
|
||||
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
|
||||
|
||||
/// Construct with a shared pointer to a target, the Process listener, and
|
||||
/// the appropriate UnixSignalsSP for the process.
|
||||
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const lldb::UnixSignalsSP &unix_signals_sp);
|
||||
|
||||
/// Destructor.
|
||||
///
|
||||
/// The destructor is virtual since this class is designed to be inherited
|
||||
|
@ -2499,6 +2490,16 @@ void PruneThreadPlans();
|
|||
|
||||
protected:
|
||||
friend class Trace;
|
||||
|
||||
/// Construct with a shared pointer to a target, and the Process listener.
|
||||
/// Uses the Host UnixSignalsSP by default.
|
||||
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
|
||||
|
||||
/// Construct with a shared pointer to a target, the Process listener, and
|
||||
/// the appropriate UnixSignalsSP for the process.
|
||||
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const lldb::UnixSignalsSP &unix_signals_sp);
|
||||
|
||||
/// Get the processor tracing type supported for this process.
|
||||
/// Responses might be different depending on the architecture and
|
||||
/// capabilities of the underlying OS.
|
||||
|
|
|
@ -36,9 +36,6 @@ public:
|
|||
|
||||
static llvm::StringRef GetPluginDescriptionStatic();
|
||||
|
||||
// Constructors and destructors
|
||||
ProcessWindows(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
|
||||
|
||||
~ProcessWindows();
|
||||
|
||||
size_t GetSTDOUT(char *buf, size_t buf_size, Status &error) override;
|
||||
|
@ -104,6 +101,8 @@ public:
|
|||
Status DisableWatchpoint(Watchpoint *wp, bool notify = true) override;
|
||||
|
||||
protected:
|
||||
ProcessWindows(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
|
||||
|
||||
Status DoGetMemoryRegionInfo(lldb::addr_t vm_addr,
|
||||
MemoryRegionInfo &info) override;
|
||||
|
||||
|
|
|
@ -193,14 +193,13 @@ void ProcessGDBRemote::Terminate() {
|
|||
PluginManager::UnregisterPlugin(ProcessGDBRemote::CreateInstance);
|
||||
}
|
||||
|
||||
lldb::ProcessSP
|
||||
ProcessGDBRemote::CreateInstance(lldb::TargetSP target_sp,
|
||||
ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect) {
|
||||
lldb::ProcessSP ProcessGDBRemote::CreateInstance(
|
||||
lldb::TargetSP target_sp, ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path, bool can_connect) {
|
||||
lldb::ProcessSP process_sp;
|
||||
if (crash_file_path == nullptr)
|
||||
process_sp = std::make_shared<ProcessGDBRemote>(target_sp, listener_sp);
|
||||
process_sp = std::shared_ptr<ProcessGDBRemote>(
|
||||
new ProcessGDBRemote(target_sp, listener_sp));
|
||||
return process_sp;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,8 +49,6 @@ class ThreadGDBRemote;
|
|||
class ProcessGDBRemote : public Process,
|
||||
private GDBRemoteClientBase::ContinueDelegate {
|
||||
public:
|
||||
ProcessGDBRemote(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
|
||||
|
||||
~ProcessGDBRemote() override;
|
||||
|
||||
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
|
||||
|
@ -239,6 +237,8 @@ protected:
|
|||
friend class GDBRemoteCommunicationClient;
|
||||
friend class GDBRemoteRegisterContext;
|
||||
|
||||
ProcessGDBRemote(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
|
||||
|
||||
bool SupportsMemoryTagging() override;
|
||||
|
||||
/// Broadcaster event bits definitions.
|
||||
|
|
|
@ -62,8 +62,8 @@ lldb::ProcessSP ScriptedProcess::CreateInstance(lldb::TargetSP target_sp,
|
|||
ScriptedProcess::ScriptedProcessInfo scripted_process_info(
|
||||
target_sp->GetProcessLaunchInfo());
|
||||
|
||||
auto process_sp = std::make_shared<ScriptedProcess>(
|
||||
target_sp, listener_sp, scripted_process_info, error);
|
||||
auto process_sp = std::shared_ptr<ScriptedProcess>(new ScriptedProcess(
|
||||
target_sp, listener_sp, scripted_process_info, error));
|
||||
|
||||
if (error.Fail() || !process_sp || !process_sp->m_script_object_sp ||
|
||||
!process_sp->m_script_object_sp->IsValid()) {
|
||||
|
|
|
@ -50,10 +50,6 @@ public:
|
|||
|
||||
static llvm::StringRef GetPluginDescriptionStatic();
|
||||
|
||||
ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const ScriptedProcess::ScriptedProcessInfo &launch_info,
|
||||
Status &error);
|
||||
|
||||
~ScriptedProcess() override;
|
||||
|
||||
bool CanDebug(lldb::TargetSP target_sp,
|
||||
|
@ -93,6 +89,10 @@ public:
|
|||
GetLoadedDynamicLibrariesInfos() override;
|
||||
|
||||
protected:
|
||||
ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const ScriptedProcess::ScriptedProcessInfo &launch_info,
|
||||
Status &error);
|
||||
|
||||
Status DoStop();
|
||||
|
||||
void Clear();
|
||||
|
|
|
@ -328,7 +328,9 @@ TEST_F(DWARFExpressionMockProcessTest, DW_OP_deref) {
|
|||
EXPECT_THAT_EXPECTED(Evaluate({DW_OP_lit0, DW_OP_deref}), llvm::Failed());
|
||||
|
||||
struct MockProcess : Process {
|
||||
using Process::Process;
|
||||
MockProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
|
||||
: Process(target_sp, listener_sp) {}
|
||||
|
||||
llvm::StringRef GetPluginName() override { return "mock process"; }
|
||||
bool CanDebug(lldb::TargetSP target,
|
||||
bool plugin_specified_by_name) override {
|
||||
|
|
|
@ -42,7 +42,8 @@ public:
|
|||
|
||||
class DummyProcess : public Process {
|
||||
public:
|
||||
using Process::Process;
|
||||
DummyProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
|
||||
: Process(target_sp, listener_sp) {}
|
||||
|
||||
bool CanDebug(lldb::TargetSP target, bool plugin_specified_by_name) override {
|
||||
return true;
|
||||
|
|
|
@ -47,7 +47,8 @@ public:
|
|||
|
||||
class DummyProcess : public Process {
|
||||
public:
|
||||
using Process::Process;
|
||||
DummyProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
|
||||
: Process(target_sp, listener_sp) {}
|
||||
|
||||
bool CanDebug(lldb::TargetSP target, bool plugin_specified_by_name) override {
|
||||
return true;
|
||||
|
|
|
@ -40,7 +40,8 @@ public:
|
|||
|
||||
class DummyProcess : public Process {
|
||||
public:
|
||||
using Process::Process;
|
||||
DummyProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
|
||||
: Process(target_sp, listener_sp) {}
|
||||
|
||||
bool CanDebug(lldb::TargetSP target, bool plugin_specified_by_name) override {
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue