diff options
author | Nico Weber <thakis@chromium.org> | 2013-05-24 01:20:22 (GMT) |
---|---|---|
committer | Nico Weber <thakis@chromium.org> | 2013-05-24 01:20:22 (GMT) |
commit | 3c8b7515f41f5b636a437a808a77fcad959b6831 (patch) | |
tree | 61adc066f9d47ea9031aadb6ab301be38c6fa738 /src | |
parent | 31ef1415f208e04000424e6fc446fe4377bc7ed3 (diff) | |
download | Ninja-3c8b7515f41f5b636a437a808a77fcad959b6831.zip Ninja-3c8b7515f41f5b636a437a808a77fcad959b6831.tar.gz Ninja-3c8b7515f41f5b636a437a808a77fcad959b6831.tar.bz2 |
Don't use va_start() with reference parameters, it's undefined behavior.
Should fix issue #584.
Diffstat (limited to 'src')
-rw-r--r-- | src/ninja.cc | 4 | ||||
-rw-r--r-- | src/util.cc | 5 | ||||
-rw-r--r-- | src/util.h | 2 |
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); } @@ -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); |