aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2015-03-01 16:16:50 -0600
committerElliott Hughes <enh@google.com>2015-03-01 16:16:50 -0600
commit1be99e695059ba7dbe44765f4b477f7e173e98d1 (patch)
treec0802988fd22e0a442d00342ebd5c9cd3654d30e
parent4bbec1e41580c9200cae03c9549fb032596b2b30 (diff)
downloadtoybox-1be99e695059ba7dbe44765f4b477f7e173e98d1.tar.gz
let the compiler check format strings
i'll be AFK for a week, so here's the patch i've been using this evening to find other format string mistakes. BSD uses __printflike and takes two arguments instead of hard-coding (1,2), but i figured that as long as you don't need the generality you'd prefer not to have it. and it's easy enough to retrofit if we ever do have a formatting function that takes other arguments.
-rw-r--r--lib/lib.h12
-rw-r--r--lib/portability.h2
2 files changed, 8 insertions, 6 deletions
diff --git a/lib/lib.h b/lib/lib.h
index a659b696..a183fd56 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -88,8 +88,8 @@ void *xzalloc(size_t size);
void *xrealloc(void *ptr, size_t size);
char *xstrndup(char *s, size_t n);
char *xstrdup(char *s);
-char *xmprintf(char *format, ...);
-void xprintf(char *format, ...);
+char *xmprintf(char *format, ...) printf_format;
+void xprintf(char *format, ...) printf_format;
void xputs(char *s);
void xputc(char c);
void xflush(void);
@@ -132,10 +132,10 @@ char *xtzset(char *new);
// lib.c
void verror_msg(char *msg, int err, va_list va);
-void error_msg(char *msg, ...);
-void perror_msg(char *msg, ...);
-void error_exit(char *msg, ...) noreturn;
-void perror_exit(char *msg, ...) noreturn;
+void error_msg(char *msg, ...) printf_format;
+void perror_msg(char *msg, ...) printf_format;
+void error_exit(char *msg, ...) printf_format noreturn;
+void perror_exit(char *msg, ...) printf_format noreturn;
ssize_t readall(int fd, void *buf, size_t len);
ssize_t writeall(int fd, void *buf, size_t len);
off_t lskip(int fd, off_t offset);
diff --git a/lib/portability.h b/lib/portability.h
index 70e33bf6..809f376c 100644
--- a/lib/portability.h
+++ b/lib/portability.h
@@ -11,8 +11,10 @@
#ifdef __GNUC__
#define noreturn __attribute__((noreturn))
+#define printf_format __attribute__((format(printf, 1, 2)))
#else
#define noreturn
+#define printf_format
#endif
// Always use long file support.