[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

llvm-svn: 356927
This commit is contained in:
Jonas Devlieghere 2019-03-25 17:27:14 +00:00
parent b27e4974d0
commit 7d3225c4b4
2 changed files with 30 additions and 3 deletions

View File

@ -640,14 +640,15 @@ std::string Args::EscapeLLDBCommandArgument(const std::string &arg,
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;

View File

@ -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, '"'));
}