[Lldb-commits] [PATCH] D120101: [lldb] Fix (unintentional) recursion in CommandObjectRegexCommand

Jonas Devlieghere via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 17 16:43:13 PST 2022


JDevlieghere created this revision.
JDevlieghere added reviewers: jingham, clayborg, aprantl, mib.
Herald added a subscriber: mgorny.
JDevlieghere requested review of this revision.

Jim noticed that the regex command is unintentionally recursive:

Let's use the following command regex as an example:

  (lldb) com regex humm 's/([^ ]+) ([^ ]+)/p %1 %2 %1 %2/'
  
  If we call it with arguments `foo bar`, thing behave as expected:

(lldb) humm foo bar
(...)
foo bar foo bar

  However, if we include `%2` in the arguments, things break down:

(lldb) humm fo%2o bar
(...)
fobaro bar fobaro bar

  The problem is that the implementation of the substitution is too naive.  It substitutes the %1 token into the target template in place, then does the %2 substitution starting with the resultant string. So if the previous substitution introduced a %2 token, it would get processed in the second sweep, etc.
  
  This patch addresses the issue by walking the command once and substituting the % variables in place. I didn't really trust myself so I also wrote a few unit tests to make sure I didn't miss any edge cases. 
  
  rdar://81236994


https://reviews.llvm.org/D120101

Files:
  lldb/source/Commands/CommandObjectRegexCommand.cpp
  lldb/source/Commands/CommandObjectRegexCommand.h
  lldb/unittests/Interpreter/CMakeLists.txt
  lldb/unittests/Interpreter/TestRegexCommand.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120101.409817.patch
Type: text/x-patch
Size: 6499 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20220218/284182ce/attachment.bin>


More information about the lldb-commits mailing list