From 3c8b7515f41f5b636a437a808a77fcad959b6831 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 23 May 2013 18:20:22 -0700 Subject: [PATCH] Don't use va_start() with reference parameters, it's undefined behavior. Should fix issue #584. --- src/ninja.cc | 4 ++-- src/util.cc | 5 ++++- 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 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& 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); -- 2.7.4