aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsimple.c1
-rw-r--r--libsimple.h10
-rw-r--r--libsimple/env.h6
-rw-r--r--libsimple/printf.h20
-rw-r--r--test.c3
-rw-r--r--vmemalloc.c1
6 files changed, 28 insertions, 13 deletions
diff --git a/libsimple.c b/libsimple.c
index 3380e29..2cf7b62 100644
--- a/libsimple.c
+++ b/libsimple.c
@@ -70,6 +70,7 @@ test_timeval(double d, time_t sec, long int usec, double rd, const char *s, cons
}
#ifdef libsimple_vasprintfa
+LIBSIMPLE_GCC_ONLY__(__attribute__((__format__(__printf__, 2, 0))))
static int
test_vasprintfa(const char *expected, const char *format, ...)
{
diff --git a/libsimple.h b/libsimple.h
index b9e263c..ffb8f8a 100644
--- a/libsimple.h
+++ b/libsimple.h
@@ -116,6 +116,15 @@
LIBSIMPLE_PRE_C11_ONLY__(LIBSIMPLE_GCC_ONLY__(__assume_aligned__(__alignof(TYPE))))
+#if __STDC_VERSION__ >= 201112L
+# define LIBSIMPLE_NORETURN _Noreturn /* TODO doc, man */
+#elif defined(__GNUC__) || defined(__clang__)
+# define LIBSIMPLE_NORETURN __attribute__((noreturn))
+#else
+# define LIBSIMPLE_NORETURN
+#endif
+
+
#include "libsimple/overflow.h"
#include "libsimple/printf.h"
#include "libsimple/definitions.h"
@@ -269,6 +278,7 @@ libsimple_unlist(void *list__, size_t i__, size_t *np__, size_t width__)
+
#if defined(__GNUC__) && !defined(__clang__)
# pragma GCC diagnostic pop
#endif
diff --git a/libsimple/env.h b/libsimple/env.h
index 530b21e..98a3d9f 100644
--- a/libsimple/env.h
+++ b/libsimple/env.h
@@ -50,7 +50,7 @@ libsimple_getenv_e(const char *name__)
* @param ap Format arguments, see vsprintf(3)
* @return 0 on success, -1 on failure
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__)))
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__, __format__(__printf__, 1, 0))))
int libsimple_vputenvf(const char *, va_list);
#ifndef vputenvf
# define vputenvf libsimple_vputenvf
@@ -101,7 +101,7 @@ libsimple_putenvf(const char *fmt__, ...)
* @param fmt Format string, see vsprintf(3)
* @param ap Format arguments, see vsprintf(3)
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__)))
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__, __format__(__printf__, 2, 0))))
void libsimple_envputenvf(int, const char *, va_list);
#ifndef envputenvf
# define envputenvf libsimple_envputenvf
@@ -155,7 +155,7 @@ libsimple_enputenvf(int status__, const char *fmt__, ...)
* @param fmt Format string, see vsprintf(3)
* @param ap Format arguments, see vsprintf(3)
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__)))
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__, __format__(__printf__, 1, 0))))
inline void
libsimple_evputenvf(const char *fmt__, va_list ap__)
{
diff --git a/libsimple/printf.h b/libsimple/printf.h
index 3b426ec..d27a380 100644
--- a/libsimple/printf.h
+++ b/libsimple/printf.h
@@ -74,7 +74,7 @@ int libsimple_asprintf(char **, const char *, ...);
* @throws ENOMEM Could not allocate enough memory
* @throws Any error specified for `fprintf`
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1, 2))))
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1, 2), __format__(__printf__, 2, 0))))
int libsimple_vasprintf(char **, const char *, va_list);
#ifndef vasprintf
# define vasprintf libsimple_vasprintf
@@ -169,7 +169,7 @@ int libsimple_vasprintf(char **, const char *, va_list);
* @param fmt The format string
* @param ap The format argument
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1))))
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1), __format__(__printf__, 1, 0))))
void libsimple_vweprintf(const char *, va_list);
#ifndef vweprintf
# define vweprintf libsimple_vweprintf
@@ -227,8 +227,8 @@ libsimple_weprintf(const char *fmt__, ...)
* @param fmt The format string
* @param ap The format argument
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(2), __noreturn__)))
-inline void
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(2), __format__(__printf__, 2, 0))))
+inline LIBSIMPLE_NORETURN void
libsimple_venprintf(int status__, const char *fmt__, va_list ap__)
{
libsimple_vweprintf(fmt__, ap__);
@@ -259,8 +259,8 @@ libsimple_venprintf(int status__, const char *fmt__, va_list ap__)
* @param fmt The format string
* @param ... The format argument
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(2), __format__(__printf__, 2, 3), __noreturn__)))
-inline void
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(2), __format__(__printf__, 2, 3))))
+inline LIBSIMPLE_NORETURN void
libsimple_enprintf(int status__, const char *fmt__, ...)
{
va_list ap__;
@@ -293,8 +293,8 @@ libsimple_enprintf(int status__, const char *fmt__, ...)
* @param fmt The format string
* @param ap The format argument
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1), __noreturn__)))
-inline void
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1), __format__(__printf__, 1, 0))))
+inline LIBSIMPLE_NORETURN void
libsimple_veprintf(const char *fmt__, va_list ap__)
{
libsimple_vweprintf(fmt__, ap__);
@@ -325,8 +325,8 @@ libsimple_veprintf(const char *fmt__, va_list ap__)
* @param fmt The format string
* @param ... The format argument
*/
-LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1), __format__(__printf__, 1, 2), __noreturn__)))
-inline void
+LIBSIMPLE_GCC_ONLY__(__attribute__((__nonnull__(1), __format__(__printf__, 1, 2))))
+inline LIBSIMPLE_NORETURN void
libsimple_eprintf(const char *fmt__, ...)
{
va_list ap__;
diff --git a/test.c b/test.c
index 3b1f559..412bd63 100644
--- a/test.c
+++ b/test.c
@@ -330,6 +330,9 @@ vfprintf(FILE *restrict stream, const char *restrict format, va_list ap)
}
+#if defined(__GNUC__)
+__attribute__((__format__(__printf__, 2, 0)))
+#endif
int
test_vfprintf(FILE *restrict stream, const char *restrict format, va_list ap)
{
diff --git a/vmemalloc.c b/vmemalloc.c
index 450affb..d725374 100644
--- a/vmemalloc.c
+++ b/vmemalloc.c
@@ -163,6 +163,7 @@ inval:
return -1;
}
+LIBSIMPLE_GCC_ONLY__(__attribute__((__const__)))
static size_t
gcd(size_t u, size_t v)
{