Author: jdevlieghere Date: Mon Mar 25 10:27:14 2019 New Revision: 356927 URL: http://llvm.org/viewvc/llvm-project?rev=356927&view=rev Log: [Args] Handle backticks to prevent crash.
Currently LLDB crashes when autocompleting a command that ends with a backtick because the quote character wasn't handled. This fixes that and adds a unit test for this function. Differential revision: https://reviews.llvm.org/D59779 Modified: lldb/trunk/source/Utility/Args.cpp lldb/trunk/unittests/Utility/ArgsTest.cpp Modified: lldb/trunk/source/Utility/Args.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/Args.cpp?rev=356927&r1=356926&r2=356927&view=diff ============================================================================== --- lldb/trunk/source/Utility/Args.cpp (original) +++ lldb/trunk/source/Utility/Args.cpp Mon Mar 25 10:27:14 2019 @@ -640,14 +640,15 @@ std::string Args::EscapeLLDBCommandArgum case '\0': chars_to_escape = " \t\\'\"`"; break; - case '\'': - chars_to_escape = ""; - break; case '"': chars_to_escape = "$\"`\\"; break; + case '`': + case '\'': + return arg; default: assert(false && "Unhandled quote character"); + return arg; } std::string res; Modified: lldb/trunk/unittests/Utility/ArgsTest.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/ArgsTest.cpp?rev=356927&r1=356926&r2=356927&view=diff ============================================================================== --- lldb/trunk/unittests/Utility/ArgsTest.cpp (original) +++ lldb/trunk/unittests/Utility/ArgsTest.cpp Mon Mar 25 10:27:14 2019 @@ -188,3 +188,29 @@ TEST(ArgsTest, GetArgumentArrayRef) { EXPECT_STREQ("foo", ref[0]); EXPECT_STREQ("bar", ref[1]); } + +TEST(ArgsTest, EscapeLLDBCommandArgument) { + const std::string foo = "foo'"; + EXPECT_EQ("foo\\'", Args::EscapeLLDBCommandArgument(foo, '\0')); + EXPECT_EQ("foo'", Args::EscapeLLDBCommandArgument(foo, '\'')); + EXPECT_EQ("foo'", Args::EscapeLLDBCommandArgument(foo, '`')); + EXPECT_EQ("foo'", Args::EscapeLLDBCommandArgument(foo, '"')); + + const std::string bar = "bar\""; + EXPECT_EQ("bar\\\"", Args::EscapeLLDBCommandArgument(bar, '\0')); + EXPECT_EQ("bar\"", Args::EscapeLLDBCommandArgument(bar, '\'')); + EXPECT_EQ("bar\"", Args::EscapeLLDBCommandArgument(bar, '`')); + EXPECT_EQ("bar\\\"", Args::EscapeLLDBCommandArgument(bar, '"')); + + const std::string baz = "baz`"; + EXPECT_EQ("baz\\`", Args::EscapeLLDBCommandArgument(baz, '\0')); + EXPECT_EQ("baz`", Args::EscapeLLDBCommandArgument(baz, '\'')); + EXPECT_EQ("baz`", Args::EscapeLLDBCommandArgument(baz, '`')); + EXPECT_EQ("baz\\`", Args::EscapeLLDBCommandArgument(baz, '"')); + + const std::string quux = "quux\t"; + EXPECT_EQ("quux\\\t", Args::EscapeLLDBCommandArgument(quux, '\0')); + EXPECT_EQ("quux\t", Args::EscapeLLDBCommandArgument(quux, '\'')); + EXPECT_EQ("quux\t", Args::EscapeLLDBCommandArgument(quux, '`')); + EXPECT_EQ("quux\t", Args::EscapeLLDBCommandArgument(quux, '"')); +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits