[Lldb-commits] [PATCH] D86667: [lldb/Target] Add custom interpreter option to `platform shell`

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 27 01:03:23 PDT 2020


labath added a comment.

I am wondering what should the platform classes which do not implement this feature do (although most of them could implemented I don't think you need to implement all of them -- PlatformGdbRemote in particular can be a bit tricky). It seems to me like it would be better for them to bail out if a non-standard shell is requested instead of silently executing a command the user did not intend.



================
Comment at: lldb/include/lldb/Target/Platform.h:633
+      const Timeout<std::micro> &timeout,
+      const bool run_in_default_shell = true);
 
----------------
const on a value parameter is useless. Also, default arguments on virtual methods are somewhat shoot-footy: <http://www.cplusplus.com/forum/general/69970/>. The [[ https://en.wikipedia.org/wiki/Non-virtual_interface_pattern | Non-virtual interface pattern ]] would solve that, and maybe have some other benefits.


================
Comment at: lldb/source/API/SBPlatform.cpp:59-68
+    if (command_interpreter && command_interpreter[0]) {
+      full_command += command_interpreter;
+      full_command += " -c ";
+    }
+
+    if (shell_command && shell_command[0]) {
+      full_command += " \"";
----------------
kastiglione wrote:
> JDevlieghere wrote:
> > Given that this pattern repeats a few times in this struct, maybe a small static helper function would be nice:
> > 
> > ```static bool is_not_empty(cont char* c) { return c && c[0]; }```
> Can these be `StringRef`, and then check with `empty()`?
Rather than duplicating this logic here (and getting it wrong for windows, for nested quotes, etc.) it would be better to just pass the custom shell to the `RunShellCommand` method. Then it use the existing quoting logic, and all that needs to change is that it now picks up the shell from the argument (if passed) instead of the baked-in default.


================
Comment at: lldb/source/Commands/CommandObjectPlatform.cpp:1621-1633
+        if (!FileSystem::Instance().Exists(option_arg)) {
+          error.SetErrorStringWithFormat("File \"%s\" doesn't exist.",
+                                         option_arg.str().c_str());
+          return error;
+        }
+
+        if (!FileSystem::Instance().Readable(option_arg)) {
----------------
This won't work for remote platforms. The checks should be at least done in the Platform class, but ideally I would really just leave it to the operating system to figure out if it can or cannot run a given command.


================
Comment at: lldb/test/API/commands/platform/basic/TestPlatformCommand.py:96
+
+    @expectedFailureAll(oslist=["windows"])
+    @no_debug_info_test
----------------
You could build a small executable to serve as the "shell". Then, this test would work everywhere.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D86667/new/

https://reviews.llvm.org/D86667



More information about the lldb-commits mailing list