From 97026cedabce510b2e2e547120f04fe0f6a5ecab Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 2 Nov 2018 11:31:39 +1030 Subject: [PATCH] compiler: add more attributes. Signed-off-by: Rusty Russell --- ccan/compiler/compiler.h | 58 +++++++++++++++++++++++++++++++ tools/configurator/configurator.c | 9 +++++ 2 files changed, 67 insertions(+) diff --git a/ccan/compiler/compiler.h b/ccan/compiler/compiler.h index bce4f25a..caa89edc 100644 --- a/ccan/compiler/compiler.h +++ b/ccan/compiler/compiler.h @@ -228,4 +228,62 @@ #define WARN_UNUSED_RESULT #endif #endif + + +#if HAVE_ATTRIBUTE_DEPRECATED +/** + * WARN_DEPRECATED - warn that a function/type/variable is deprecated when used. + * + * Used to mark a function, type or variable should not be used. + * + * Example: + * WARN_DEPRECATED char *oldfunc(char *buf); + */ +#define WARN_DEPRECATED __attribute__((__deprecated__)) +#else +#define WARN_DEPRECATED +#endif + + +#if HAVE_ATTRIBUTE_NONNULL +/** + * NO_NULL_ARGS - specify that no arguments to this function can be NULL. + * + * The compiler will warn if any pointer args are NULL. + * + * Example: + * NO_NULL_ARGS char *my_copy(char *buf); + */ +#define NO_NULL_ARGS __attribute__((__nonnull__)) + +/** + * NON_NULL_ARGS - specify that some arguments to this function can't be NULL. + * @...: 1-based argument numbers for which args can't be NULL. + * + * The compiler will warn if any of the specified pointer args are NULL. + * + * Example: + * char *my_copy2(char *buf, char *maybenull) NON_NULL_ARGS(1, 2); + */ +#define NON_NULL_ARGS(index, ...) __attribute__((__nonnull__(index, __VA_ARGS__))) +#else +#define NO_NULL_ARGS +#define NON_NULL_ARGS(index, ...) +#endif + + +#if HAVE_ATTRIBUTE_SENTINEL +/** + * LAST_ARG_NULL - specify the last argument of a variadic function must be NULL. + * + * The compiler will warn if the last argument isn't NULL. + * + * Example: + * char *join_string(char *buf, ...) LAST_ARG_NULL; + */ +#define LAST_ARG_NULL __attribute__((__sentinel__)) +#else +#define LAST_ARG_NULL +#endif + #endif /* CCAN_COMPILER_H */ diff --git a/tools/configurator/configurator.c b/tools/configurator/configurator.c index 239e91c9..1386fc90 100644 --- a/tools/configurator/configurator.c +++ b/tools/configurator/configurator.c @@ -136,6 +136,15 @@ static const struct test base_tests[] = { { "HAVE_ATTRIBUTE_CONST", "__attribute__((const)) support", "DEFINES_FUNC", NULL, NULL, "static int __attribute__((const)) func(int x) { return x; }" }, + { "HAVE_ATTRIBUTE_DEPRECATED", "__attribute__((deprecated)) support", + "DEFINES_FUNC", NULL, NULL, + "static int __attribute__((deprecated)) func(int x) { return x; }" }, + { "HAVE_ATTRIBUTE_NONNULL", "__attribute__((nonnull)) support", + "DEFINES_FUNC", NULL, NULL, + "static char *__attribute__((nonnull)) func(char *p) { return p; }" }, + { "HAVE_ATTRIBUTE_SENTINEL", "__attribute__((sentinel)) support", + "DEFINES_FUNC", NULL, NULL, + "static int __attribute__((sentinel)) func(int i, ...) { return i; }" }, { "HAVE_ATTRIBUTE_PURE", "__attribute__((pure)) support", "DEFINES_FUNC", NULL, NULL, "static int __attribute__((pure)) func(int x) { return x; }" }, -- 2.39.2