[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:
Michał Górny 2022-08-05 19:39:42 +02:00
parent e640250454
commit 9b031d5e3a
11 changed files with 35 additions and 31 deletions

View File

@ -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; }
};

View File

@ -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.

View File

@ -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;

View File

@ -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;
}

View File

@ -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.

View File

@ -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()) {

View File

@ -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();

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -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;