<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>That would indeed be more appropriate. I'm not actually familiar with this part of the code, so I can't say whether or not it will work without further changes, but it certainly ought to be <i>correct.</i> +John in case there's something obvious I'm missing.</div><div><br></div><div>Jordan</div><div><br></div><br><div><div>On Feb 24, 2014, at 20:07 , Richard Smith <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><p dir="ltr">The more appropriate thing to do would be to give them array-of-const-char types. Is that also OK?</p>
<div class="gmail_quote">On 24 Feb 2014 19:53, "Jordan Rose" <<a href="mailto:jordan_rose@apple.com">jordan_rose@apple.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div>We can certainly give those buffers type const char * without harming anything.</div><div><br></div><div>Jordan</div><div><br></div><br><div><div>On Feb 24, 2014, at 19:24 , Richard Smith <<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>> wrote:</div>
<br><blockquote type="cite"><div dir="ltr">This caused PR18939. Please fix or revert, thanks!<div><br></div><div>Looks like the bug is in Sema::ParseObjCStringLiteral -- it synthesizes a string literal from a token concatenation and gives it the type "char*"</div>

</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Feb 20, 2014 at 9:05 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Thu Feb 20 11:05:38 2014<br>
New Revision: 201795<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=201795&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=201795&view=rev</a><br>
Log:<br>
Sema: Emit a warning for non-null terminated format strings and other pathological cases.<br>
<br>
PR18905.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
    cfe/trunk/lib/Sema/SemaChecking.cpp<br>
    cfe/trunk/test/Sema/format-strings.c<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=201795&r1=201794&r2=201795&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=201795&r1=201794&r2=201795&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Feb 20 11:05:38 2014<br>
@@ -6223,6 +6223,8 @@ def warn_format_string_is_wide_literal :<br>
   "format string should not be a wide string">, InGroup<Format>;<br>
 def warn_printf_format_string_contains_null_char : Warning<<br>
   "format string contains '\\0' within the string body">, InGroup<Format>;<br>
+def warn_printf_format_string_not_null_terminated : Warning<<br>
+  "format string is not null-terminated">, InGroup<Format>;<br>
 def warn_printf_asterisk_missing_arg : Warning<<br>
   "'%select{*|.*}0' specified field %select{width|precision}0 is missing a matching 'int' argument">,<br>
   InGroup<Format>;<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaChecking.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=201795&r1=201794&r2=201795&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=201795&r1=201794&r2=201795&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Thu Feb 20 11:05:38 2014<br>
@@ -3493,9 +3493,25 @@ void Sema::CheckFormatString(const Strin<br>
   // Str - The format string.  NOTE: this is NOT null-terminated!<br>
   StringRef StrRef = FExpr->getString();<br>
   const char *Str = StrRef.data();<br>
-  unsigned StrLen = StrRef.size();<br>
+  // Account for cases where the string literal is truncated in a declaration.<br>
+  const ConstantArrayType *T = Context.getAsConstantArrayType(FExpr->getType());<br>
+  assert(T && "String literal not of constant array type!");<br>
+  size_t TypeSize = T->getSize().getZExtValue();<br>
+  size_t StrLen = std::min(std::max(TypeSize, size_t(1)) - 1, StrRef.size());<br>
   const unsigned numDataArgs = Args.size() - firstDataArg;<br>
-<br>
+<br>
+  // Emit a warning if the string literal is truncated and does not contain an<br>
+  // embedded null character.<br>
+  if (TypeSize <= StrRef.size() &&<br>
+      StrRef.substr(0, TypeSize).find('\0') == StringRef::npos) {<br>
+    CheckFormatHandler::EmitFormatDiagnostic(<br>
+        *this, inFunctionCall, Args[format_idx],<br>
+        PDiag(diag::warn_printf_format_string_not_null_terminated),<br>
+        FExpr->getLocStart(),<br>
+        /*IsStringLocation=*/true, OrigFormatExpr->getSourceRange());<br>
+    return;<br>
+  }<br>
+<br>
   // CHECK: empty format string?<br>
   if (StrLen == 0 && numDataArgs > 0) {<br>
     CheckFormatHandler::EmitFormatDiagnostic(<br>
<br>
Modified: cfe/trunk/test/Sema/format-strings.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings.c?rev=201795&r1=201794&r2=201795&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings.c?rev=201795&r1=201794&r2=201795&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/test/Sema/format-strings.c (original)<br>
+++ cfe/trunk/test/Sema/format-strings.c Thu Feb 20 11:05:38 2014<br>
@@ -535,6 +535,21 @@ void pr9751() {<br>
          0.0); // expected-warning{{format specifies}}<br>
 }<br>
<br>
+void pr18905() {<br>
+  const char s1[] = "s\0%s"; // expected-note{{format string is defined here}}<br>
+  const char s2[1] = "s"; // expected-note{{format string is defined here}}<br>
+  const char s3[2] = "s\0%s"; // expected-warning{{initializer-string for char array is too long}}<br>
+  const char s4[10] = "s";<br>
+  const char s5[0] = "%s"; // expected-warning{{initializer-string for char array is too long}}<br>
+                           // expected-note@-1{{format string is defined here}}<br>
+<br>
+  printf(s1); // expected-warning{{format string contains '\0' within the string body}}<br>
+  printf(s2); // expected-warning{{format string is not null-terminated}}<br>
+  printf(s3); // no-warning<br>
+  printf(s4); // no-warning<br>
+  printf(s5); // expected-warning{{format string is not null-terminated}}<br>
+}<br>
+<br>
 void __attribute__((format(strfmon,1,2))) monformat(const char *fmt, ...);<br>
 void __attribute__((format(strftime,1,0))) dateformat(const char *fmt);<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
</blockquote></div>
</blockquote></div><br></body></html>