changeset 26147:216d857732eb

Add static compile-time checking of printf functions (bug #55046). * build-aux/mk-octave-config-h.sh, oct-conf-post.in.h: New macro OCTAVE_FORMAT_ATTRIBUTE. * libinterp/corefcn/error.h: Use macro OCTAVE_FORMAT_ATTRIBUTE for printf functions.
author Kai T. Ohlhus <k.ohlhus@gmail.com>
date Thu, 29 Nov 2018 12:54:15 +0100
parents 389d86d41cbf
children 8c72f0345ee8
files build-aux/mk-octave-config-h.sh libinterp/corefcn/error.h oct-conf-post.in.h
diffstat 3 files changed, 22 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/build-aux/mk-octave-config-h.sh	Thu Nov 29 12:45:13 2018 +0100
+++ b/build-aux/mk-octave-config-h.sh	Thu Nov 29 12:54:15 2018 +0100
@@ -106,6 +106,7 @@
 #    else
 #      define OCTAVE_DEPRECATED(ver, msg) __attribute__ ((__deprecated__))
 #    endif
+#    define OCTAVE_FORMAT_ATTRIBUTE(type, index, first) __attribute__ ((__format__(type, index, first)))
 #    define OCTAVE_NORETURN __attribute__ ((__noreturn__))
 #    define OCTAVE_UNUSED __attribute__ ((__unused__))
 
@@ -114,6 +115,7 @@
 #    define HAVE_OCTAVE_UNUSED_ATTR 1
 #  else
 #    define OCTAVE_DEPRECATED(ver, msg)
+#    define OCTAVE_FORMAT_ATTRIBUTE(type, index, first)
 #    define OCTAVE_NORETURN
 #    define OCTAVE_UNUSED
 
--- a/libinterp/corefcn/error.h	Thu Nov 29 12:45:13 2018 +0100
+++ b/libinterp/corefcn/error.h	Thu Nov 29 12:54:15 2018 +0100
@@ -50,29 +50,38 @@
 extern OCTINTERP_API void
 vmessage (const char *name, const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 2, 3)
 extern OCTINTERP_API void message (const char *name, const char *fmt, ...);
 
 extern OCTINTERP_API void vwarning (const char *fmt, va_list args);
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 1, 2)
 extern OCTINTERP_API void warning (const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void verror (const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 1, 2)
 OCTAVE_NORETURN OCTINTERP_API extern
 void error (const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void verror (octave::execution_exception&, const char *fmt, va_list args);
+
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 2, 3)
 OCTAVE_NORETURN OCTINTERP_API extern
 void error (octave::execution_exception&, const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void verror_with_cfn (const char *fmt, va_list args);
+
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 1, 2)
 OCTAVE_NORETURN OCTINTERP_API extern
 void error_with_cfn (const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void vparse_error (const char *fmt, va_list args);
+
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 1, 2)
 OCTAVE_NORETURN OCTINTERP_API extern
 void parse_error (const char *fmt, ...);
 
@@ -80,39 +89,46 @@
 vmessage_with_id (const char *id, const char *name,
                   const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 3, 4)
 extern OCTINTERP_API void
 message_with_id (const char *id, const char *name, const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void vusage_with_id (const char *id, const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 2, 3)
 OCTAVE_NORETURN OCTINTERP_API extern
 void usage_with_id (const char *id, const char *fmt, ...);
 
 extern OCTINTERP_API void
 vwarning_with_id (const char *id, const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 2, 3)
 extern OCTINTERP_API void
 warning_with_id (const char *id, const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void verror_with_id (const char *id, const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 2, 3)
 OCTAVE_NORETURN OCTINTERP_API extern
 void error_with_id (const char *id, const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void verror_with_id_cfn (const char *id, const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 2, 3)
 OCTAVE_NORETURN OCTINTERP_API extern
 void error_with_id_cfn (const char *id, const char *fmt, ...);
 
 OCTAVE_NORETURN OCTINTERP_API extern
 void vparse_error_with_id (const char *id, const char *fmt, va_list args);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 2, 3)
 OCTAVE_NORETURN OCTINTERP_API extern
 void parse_error_with_id (const char *id, const char *fmt, ...);
 
+OCTAVE_FORMAT_ATTRIBUTE (__printf__, 1, 2)
 OCTAVE_NORETURN OCTINTERP_API extern
 void panic (const char *fmt, ...);
 
--- a/oct-conf-post.in.h	Thu Nov 29 12:45:13 2018 +0100
+++ b/oct-conf-post.in.h	Thu Nov 29 12:54:15 2018 +0100
@@ -39,6 +39,9 @@
 #  endif
 #  define HAVE_OCTAVE_DEPRECATED_ATTR 1
 
+#  define OCTAVE_FORMAT_ATTRIBUTE(type, index, first) __attribute__ ((__format__(type, index, first)))
+#  define HAVE_OCTAVE_FORMAT_ATTRIBUTE_ATTR 1
+
 #  define OCTAVE_NORETURN __attribute__ ((__noreturn__))
 #  define HAVE_OCTAVE_NORETURN_ATTR 1
 
@@ -46,6 +49,7 @@
 #  define HAVE_OCTAVE_UNUSED_ATTR 1
 #else
 #  define OCTAVE_DEPRECATED(ver, msg)
+#  define OCTAVE_FORMAT_ATTRIBUTE(type, index, first)
 #  define OCTAVE_NORETURN
 #  define OCTAVE_UNUSED
 #endif