[Lldb-commits] [lldb] 7652377 - [lldb] Prevent mutation of CommandAlias::GetOptionArguments

Dave Lee via lldb-commits lldb-commits at lists.llvm.org
Mon May 8 09:45:31 PDT 2023


Author: Dave Lee
Date: 2023-05-08T09:45:26-07:00
New Revision: 765237779ce4dbb60f4faf9ebc91386ce5218e15

URL: https://github.com/llvm/llvm-project/commit/765237779ce4dbb60f4faf9ebc91386ce5218e15
DIFF: https://github.com/llvm/llvm-project/commit/765237779ce4dbb60f4faf9ebc91386ce5218e15.diff

LOG: [lldb] Prevent mutation of CommandAlias::GetOptionArguments

Fix a mutation of `CommandAlias::m_option_args_sp`, which resulted in cases where
aliases would fail to run on second, and subsequent times.

For example, an alias such as:

```
command alias p1 p 1
```

When run the second time, the following error would be reported to the user:

```
error: expression failed to parse:
error: <user expression 1>:1:1: expression is not assignable
--  1
^   ~
```

To fix this, `CommandAlias::Desugar` now constructs options to a freshly constructed
vector, rather than by appending to the results of `GetOptionArguments`.

rdar://107770836

Differential Revision: https://reviews.llvm.org/D150078

Added: 
    

Modified: 
    lldb/source/Interpreter/CommandAlias.cpp
    lldb/test/API/commands/command/nested_alias/TestNestedAlias.py

Removed: 
    


################################################################################
diff  --git a/lldb/source/Interpreter/CommandAlias.cpp b/lldb/source/Interpreter/CommandAlias.cpp
index e36edcac15a59..f6eaeacff81ef 100644
--- a/lldb/source/Interpreter/CommandAlias.cpp
+++ b/lldb/source/Interpreter/CommandAlias.cpp
@@ -8,6 +8,7 @@
 
 #include "lldb/Interpreter/CommandAlias.h"
 
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/ErrorHandling.h"
 
 #include "lldb/Interpreter/CommandInterpreter.h"
@@ -211,9 +212,9 @@ std::pair<lldb::CommandObjectSP, OptionArgVectorSP> CommandAlias::Desugar() {
     // FIXME: This doesn't work if the original alias fills a slot in the
     // underlying alias, since this just appends the two lists.
     auto desugared = ((CommandAlias *)underlying.get())->Desugar();
-    auto options = GetOptionArguments();
-    options->insert(options->begin(), desugared.second->begin(),
-                    desugared.second->end());
+    OptionArgVectorSP options = std::make_shared<OptionArgVector>();
+    llvm::append_range(*options, *desugared.second);
+    llvm::append_range(*options, *GetOptionArguments());
     return {desugared.first, options};
   }
 

diff  --git a/lldb/test/API/commands/command/nested_alias/TestNestedAlias.py b/lldb/test/API/commands/command/nested_alias/TestNestedAlias.py
index 29b4af335028d..7cce6138aa3e0 100644
--- a/lldb/test/API/commands/command/nested_alias/TestNestedAlias.py
+++ b/lldb/test/API/commands/command/nested_alias/TestNestedAlias.py
@@ -101,3 +101,7 @@ def cleanup():
         self.expect('command alias two expr -- 2')
         self.expect('command alias add_two two +')
         self.expect('add_two 3', patterns=[' = 5$'])
+        # Check that aliases to aliases to raw input commands work the second
+        # and subsequent times.
+        self.expect('add_two 3', patterns=[' = 5$'])
+        self.expect('add_two 3', patterns=[' = 5$'])


        


More information about the lldb-commits mailing list