Skip to content

Commit

Permalink
[Bash-autocomplete] Fix crash when invoking --autocomplete without va…
Browse files Browse the repository at this point in the history
…lue.

Summary:
Currently clang segfaults when invoked with `clang --autocomplete=`.
This patch adds the necessary boundary checks and some tests for corner cases like this.

Reviewers: yamaguchi

Reviewed By: yamaguchi

Subscribers: cfe-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@312533 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Teemperor committed Sep 5, 2017
1 parent d0be02a commit 5a2b037
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
10 changes: 4 additions & 6 deletions lib/Driver/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1165,12 +1165,10 @@ void Driver::handleAutocompletions(StringRef PassedFlags) const {
unsigned short DisableFlags =
options::NoDriverOption | options::Unsupported | options::Ignored;
// We want to show cc1-only options only when clang is invoked as "clang
// -cc1".
// When clang is invoked as "clang -cc1", we add "#" to the beginning of an
// --autocomplete
// option so that the clang driver can distinguish whether it is requested to
// show cc1-only options or not.
if (PassedFlags[0] == '#') {
// -cc1". When clang is invoked as "clang -cc1", we add "#" to the beginning
// of an --autocomplete option so that the clang driver can distinguish
// whether it is requested to show cc1-only options or not.
if (PassedFlags.size() > 0 && PassedFlags[0] == '#') {
DisableFlags &= ~options::NoDriverOption;
PassedFlags = PassedFlags.substr(1);
}
Expand Down
13 changes: 13 additions & 0 deletions test/Driver/autocomplete.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@
// autocompletion. You may have to update tests in this file when you
// add/modify flags, change HelpTexts or the values of some flags.

// Some corner cases.
// RUN: %clang --autocomplete= | FileCheck %s -check-prefix=ALL_FLAGS
// RUN: %clang --autocomplete=# | FileCheck %s -check-prefix=ALL_FLAGS
// Let's pick some example flags that are hopefully unlikely to change.
// ALL_FLAGS: -fast
// ALL_FLAGS: -fastcp
// ALL_FLAGS: -fastf
// Just test that this doesn't crash:
// RUN: %clang --autocomplete=,
// RUN: %clang --autocomplete==
// RUN: %clang --autocomplete=,,
// RUN: %clang --autocomplete=-

// RUN: %clang --autocomplete=-fsyn | FileCheck %s -check-prefix=FSYN
// FSYN: -fsyntax-only
// RUN: %clang --autocomplete=-std= | FileCheck %s -check-prefix=STD
Expand Down

0 comments on commit 5a2b037

Please sign in to comment.