vprintf(3) and "format string is not a string literal"

I'm not subscribed to clang mailing list, so not sure if my mail
comes throught. I'm reading the list via gmane.

I guess utilizing gcc __attribute__((format(...))) would help
here. You could put that at the log

int logmessage(
  int loglevel,
  char const *fmt __attribute__ (format (printf, 2, 3))),
  ...) {
   // more code

That way the compiler knows that fmt *IS* a format string and
won't need to warn when it is used in vprintf().

Code that calls logmessage() would know that fmt is a printf-like
format string and can check calls to logmessage. This attribute
would even help in the case of call-backs.

BTW: why "char const *" and not "const char*" ?

I like this solution. I think this would catch 90% of the correct cases, while suppressing most bogus messages.

I just committed patch r45114 that partially implements this solution:


Our support for attributes is still only preliminary, so right now I have coded the format string checker to not emit a warning if the format string for a vprintf-like function comes from the function parameter of the caller. Later I will add the support to consult the attributes of the calling function to see if it should be treated like a printf function.