summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ninja.cc4
-rw-r--r--src/util.cc5
-rw-r--r--src/util.h2
3 files changed, 7 insertions, 4 deletions
diff --git a/src/ninja.cc b/src/ninja.cc
index b4797ed..bb3abe1 100644
--- a/src/ninja.cc
+++ b/src/ninja.cc
@@ -385,7 +385,7 @@ int ToolTargets(Globals* globals, int argc, char* argv[]) {
return ToolTargetsList(globals->state);
} else {
const char* suggestion =
- SpellcheckString(mode, "rule", "depth", "all", NULL);
+ SpellcheckString(mode.c_str(), "rule", "depth", "all", NULL);
if (suggestion) {
Error("unknown target tool mode '%s', did you mean '%s'?",
mode.c_str(), suggestion);
@@ -628,7 +628,7 @@ bool DebugEnable(const string& name, Globals* globals) {
return true;
} else {
const char* suggestion =
- SpellcheckString(name, "stats", "explain", NULL);
+ SpellcheckString(name.c_str(), "stats", "explain", NULL);
if (suggestion) {
Error("unknown debug setting '%s', did you mean '%s'?",
name.c_str(), suggestion);
diff --git a/src/util.cc b/src/util.cc
index fa72dd2..b9c2c0d 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -234,13 +234,16 @@ const char* SpellcheckStringV(const string& text,
return result;
}
-const char* SpellcheckString(const string& text, ...) {
+const char* SpellcheckString(const char* text, ...) {
+ // Note: This takes a const char* instead of a string& because using
+ // va_start() with a reference parameter is undefined behavior.
va_list ap;
va_start(ap, text);
vector<const char*> words;
const char* word;
while ((word = va_arg(ap, const char*)))
words.push_back(word);
+ va_end(ap);
return SpellcheckStringV(text, words);
}
diff --git a/src/util.h b/src/util.h
index 9740565..6788410 100644
--- a/src/util.h
+++ b/src/util.h
@@ -59,7 +59,7 @@ const char* SpellcheckStringV(const string& text,
const vector<const char*>& words);
/// Like SpellcheckStringV, but takes a NULL-terminated list.
-const char* SpellcheckString(const string& text, ...);
+const char* SpellcheckString(const char* text, ...);
/// Removes all Ansi escape codes (http://www.termsys.demon.co.uk/vtansi.htm).
string StripAnsiEscapeCodes(const string& in);