From 570276811b1e6ac63a18eef06af429ee3f4b12db Mon Sep 17 00:00:00 2001 From: Elizabeth Smith Date: Tue, 6 May 2014 11:44:31 -0700 Subject: [PATCH] printf format checking for msvc Summary: sal annotations can be used to do similar (not exact) checking to the functionality provided by the format attribute in gcc the annotations are done by prefixing the format string with a value which makes the macro definitions a bit messy @override-unit-failures Test Plan: fbconfig -r folly && fbmake runtests Reviewed By: delong.j@fb.com FB internal diff: D1313653 --- folly/Portability.h | 15 +++++++++++++++ folly/String.h | 16 ++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/folly/Portability.h b/folly/Portability.h index 4d623eb4..68d7d969 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -45,6 +45,21 @@ struct MaxAlign { char c; } __attribute__((aligned)); // compiler specific attribute translation // msvc should come first, so if clang is in msvc mode it gets the right defines +// NOTE: this will only do checking in msvc with versions that support /analyze +#if _MSC_VER +# ifdef _USE_ATTRIBUTES_FOR_SAL +# undef _USE_ATTRIBUTES_FOR_SAL +# endif +# define _USE_ATTRIBUTES_FOR_SAL 1 +# include +# define FOLLY_PRINTF_FORMAT _Printf_format_string_ +# define FOLLY_PRINTF_FORMAT_ATTR(format_param, dots_param) /**/ +#else +# define FOLLY_PRINTF_FORMAT /**/ +# define FOLLY_PRINTF_FORMAT_ATTR(format_param, dots_param) \ + __attribute__((format(printf, format_param, dots_param))) +#endif + // noreturn #if defined(_MSC_VER) # define FOLLY_NORETURN __declspec(noreturn) diff --git a/folly/String.h b/folly/String.h index 0dd8c1b3..b8ee9f39 100644 --- a/folly/String.h +++ b/folly/String.h @@ -173,16 +173,16 @@ String uriUnescape(StringPiece str, UriEscapeMode mode = UriEscapeMode::ALL) { * resulting string, and the second appends the produced characters to * the specified string and returns a reference to it. */ -std::string stringPrintf(const char* format, ...) - __attribute__ ((format (printf, 1, 2))); +std::string stringPrintf(FOLLY_PRINTF_FORMAT const char* format, ...) + FOLLY_PRINTF_FORMAT_ATTR(1, 2); -/** Similar to stringPrintf, with different signiture. - */ -void stringPrintf(std::string* out, const char* fmt, ...) - __attribute__ ((format (printf, 2, 3))); +/* Similar to stringPrintf, with different signature. */ +void stringPrintf(std::string* out, FOLLY_PRINTF_FORMAT const char* fmt, ...) + FOLLY_PRINTF_FORMAT_ATTR(2, 3); -std::string& stringAppendf(std::string* output, const char* format, ...) - __attribute__ ((format (printf, 2, 3))); +std::string& stringAppendf(std::string* output, + FOLLY_PRINTF_FORMAT const char* format, ...) + FOLLY_PRINTF_FORMAT_ATTR(2, 3); /** * Backslashify a string, that is, replace non-printable characters -- 2.34.1