diff options
-rw-r--r-- | libsimple.c | 1 | ||||
-rw-r--r-- | libsimple.h | 10 | ||||
-rw-r--r-- | libsimple/env.h | 6 | ||||
-rw-r--r-- | libsimple/printf.h | 20 | ||||
-rw-r--r-- | test.c | 3 | ||||
-rw-r--r-- | vmemalloc.c | 1 |
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__; @@ -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) { |