]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Add __attribute__(format)s for our varargs printf/scanf wrappers
authorNick Mathewson <nickm@torproject.org>
Wed, 30 May 2012 16:14:38 +0000 (12:14 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 30 May 2012 16:14:38 +0000 (12:14 -0400)
It turns out that if you set the third argument of
__attribute__(format) to 0, GCC and Clang will check the format
argument without expecting to find variadic arguments.  This is the
correct behavior for vsnprintf, vasprintf, and vscanf.

I'm hoping this will fix bug 5969 (a clang warning) by telling clang that
the format argument to tor_vasprintf is indeed a format string.

changes/bug5969_022 [new file with mode: 0644]
src/common/compat.h
src/common/util.h

diff --git a/changes/bug5969_022 b/changes/bug5969_022
new file mode 100644 (file)
index 0000000..57c8744
--- /dev/null
@@ -0,0 +1,7 @@
+  o Minor bugfixes
+    - Fix a build warning with Clang 3.1 related to our use of vasprint.
+      Fix for bug 5969. Bugfix on 0.2.2.11-alpha.
+
+  o Compilation improvements:
+    - Tell GCC and Clang to check for any errors in format strings passed
+      to the tor_v*(print|scan)f functions.
index d2f1fd12959a5ba267b14a768ef3cc5b57c62dd4..fc70caf50cde803cf4d9c0237d9148d7e619afb0 100644 (file)
@@ -261,11 +261,12 @@ void tor_munmap_file(tor_mmap_t *handle) ATTR_NONNULL((1));
 int tor_snprintf(char *str, size_t size, const char *format, ...)
   CHECK_PRINTF(3,4) ATTR_NONNULL((1,3));
 int tor_vsnprintf(char *str, size_t size, const char *format, va_list args)
-  ATTR_NONNULL((1,3));
+  CHECK_PRINTF(3,0) ATTR_NONNULL((1,3));
 
 int tor_asprintf(char **strp, const char *fmt, ...)
   CHECK_PRINTF(2,3);
-int tor_vasprintf(char **strp, const char *fmt, va_list args);
+int tor_vasprintf(char **strp, const char *fmt, va_list args)
+  CHECK_PRINTF(2,0);
 
 const void *tor_memmem(const void *haystack, size_t hlen, const void *needle,
                        size_t nlen)  ATTR_PURE ATTR_NONNULL((1,3));
index b9db25ca736ada654ade3ae2d94eb09c4295f470..d4771562eeaf4e7ce479a7a27e921050949ebe47 100644 (file)
@@ -211,7 +211,11 @@ const char *escaped(const char *string);
 struct smartlist_t;
 void wrap_string(struct smartlist_t *out, const char *string, size_t width,
                  const char *prefix0, const char *prefixRest);
-int tor_vsscanf(const char *buf, const char *pattern, va_list ap);
+int tor_vsscanf(const char *buf, const char *pattern, va_list ap)
+#ifdef __GNUC__
+  __attribute__((format(scanf, 2, 0)))
+#endif
+  ;
 int tor_sscanf(const char *buf, const char *pattern, ...)
 #ifdef __GNUC__
   __attribute__((format(scanf, 2, 3)))