Browse Source

Use GNU format-checking attribute when available for applog

Luke Dashjr 13 years ago
parent
commit
f8e268cfb2
3 changed files with 22 additions and 3 deletions
  1. 19 0
      configure.ac
  2. 2 2
      logging.h
  3. 1 1
      miner.h

+ 19 - 0
configure.ac

@@ -409,6 +409,25 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([static int __attribute__((warn_unused_result)
 			  AC_DEFINE([HAVE_WARN_UNUSED_RESULT], [1],
                                     [Define if __attribute__((warn_unused_result))]))
 
+
+AC_MSG_CHECKING([if GNU format attribute compiles])
+AC_TRY_COMPILE([
+	#define FORMAT_SYNTAX_CHECK(...) __attribute__(( format(__VA_ARGS__) ))
+	int myfunc(char *fmt, ...) FORMAT_SYNTAX_CHECK(printf, 1, 2);
+	int myfunc(char *fmt, ...) {
+		return 42;
+	}
+], [
+	myfunc("abc%d", 42);
+], [
+	AC_MSG_RESULT([yes])
+	AC_DEFINE_UNQUOTED([FORMAT_SYNTAX_CHECK(...)], [__attribute__(( format(__VA_ARGS__) ))], [Syntax of format-checking attribute])
+], [
+	AC_MSG_RESULT([no])
+	AC_DEFINE_UNQUOTED([FORMAT_SYNTAX_CHECK(...)], [])
+])
+
+
 if test "x$prefix" = xNONE; then
 	prefix=/usr/local
 fi

+ 2 - 2
logging.h

@@ -28,8 +28,8 @@ extern bool want_per_device_stats;
 extern int opt_log_level;
 
 /* low-level logging functions with priority parameter */
-extern void vapplog(int prio, const char *fmt, va_list ap);
-extern void applog(int prio, const char *fmt, ...);
+extern void vapplog(int prio, const char *fmt, va_list ap) FORMAT_SYNTAX_CHECK(printf, 2, 0);
+extern void applog(int prio, const char *fmt, ...) FORMAT_SYNTAX_CHECK(printf, 2, 3);
 
 /* high-level logging functions with implicit priority */
 extern void log_error(const char *fmt, ...);

+ 1 - 1
miner.h

@@ -1080,7 +1080,7 @@ extern void switch_pools(struct pool *selected);
 extern void remove_pool(struct pool *pool);
 extern void write_config(FILE *fcfg);
 extern void default_save_file(char *filename);
-extern bool log_curses_only(int prio, const char *f, va_list ap);
+extern bool log_curses_only(int prio, const char *f, va_list ap) FORMAT_SYNTAX_CHECK(printf, 2, 0);
 extern void clear_logwin(void);
 extern bool pool_tclear(struct pool *pool, bool *var);
 extern struct thread_q *tq_new(void);