summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2013-05-24 01:25:09 (GMT)
committerNico Weber <nicolasweber@gmx.de>2013-05-24 01:25:09 (GMT)
commit7b59fde1feb193d63df8b6b31ea6894635f18906 (patch)
tree6ecfac48c6b615cda23dc7fc91e08b9f5fdd3005
parent145d4f2f2cf54771f663caa99d9da690eee6438e (diff)
parent3c8b7515f41f5b636a437a808a77fcad959b6831 (diff)
downloadNinja-7b59fde1feb193d63df8b6b31ea6894635f18906.zip
Ninja-7b59fde1feb193d63df8b6b31ea6894635f18906.tar.gz
Ninja-7b59fde1feb193d63df8b6b31ea6894635f18906.tar.bz2
Merge pull request #585 from nico/fixcrash
Don't use va_start() with reference parameters, it's undefined behavior.
-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 7ee40df..58c1c80 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);
@@ -632,7 +632,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);