This patch introduces two new warnings about bad std::string constructor invocation. They can be turned on with -Wstring-constructor.<div><br></div><div>The first pattern it catches is: </div><div>std::string s('a', 10);</div>

<div><br></div><div>The intention probably was to call </div><div>std::string s(10, 'a');</div><div><br></div><div>which creates "aaaaaaaaaa". But implicit casts actually turn it into</div><div>std::string s(97, '\10');</div>

<div><br></div><div>The new warning says:</div><div><br></div><div><div><div>str.cc:6:17: warning: argument implicitly cast from 'char' to 'size_type' (aka 'unsigned long') [-Wstring-constructor]</div>

<div>  std::string s('a', 10);</div><div>                ^~~</div><div>str.cc:6:17: note: did you mean to swap the two arguments?</div><div>  std::string s('a', 10);</div><div>                ^~~~~~~</div>

<div>                10, 'a'</div></div></div><div><br></div><div><br></div><div>The second pattern the patch catches is:</div><div>std::string v("abc", 10);</div><div><br></div><div>The constructor will read 10 characters into the new string, but there are only four (including the null terminator). This reads junk if we're lucky, and segfaults or opens security holes if we're unlucky.</div>

<div><br></div><div>The new warning says:</div><div><div>str.cc:9:17: warning: string literal is shorter than the number of characters to read (3 vs 10) [-Wstring-constructor]</div><div>  std::string v("abc", 10);</div>

<div>                ^~~~~  ~~</div></div><div><br></div><div>If the literal is just one character long, we suggest to swap the arguments and turn the string literal into a char literal:</div><div><div>str.cc:8:17: warning: string literal is shorter than the number of characters to read (1 vs 10) [-Wstring-constructor]</div>

<div>  std::string u("a", 10);</div><div>                ^~~  ~~</div><div>str.cc:8:17: note: did you mean to swap the two arguments?</div><div>  std::string u("a", 10);</div><div>                ^~~~~~~</div>

<div>                10, 'a'</div></div><div><br></div>
<div><br></div>