From: Paolo Bonzini Date: Fri, 6 Nov 2009 09:39:13 +0000 (+0100) Subject: Add sentinel attribute for NULL terminated arg lists X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=649bcd72fec9f93253201126f498982028c487c0;p=libvirt.git Add sentinel attribute for NULL terminated arg lists * src/internal.h (ATTRIBUTE_SENTINEL): New, it's a ggc feature and protected as such * src/util/buf.c (virBufferStrcat): Use it. * src/util/ebtables.c (ebtablesAddRemoveRule): Use it. * src/util/iptables.c (iptableAddRemoveRule: Use it. * src/util/qparams.h (new_qparam_set, append_qparams): Use it. * docs/apibuild.py: avoid breaking the API generator with that new internal keyword macro --- diff --git a/docs/apibuild.py b/docs/apibuild.py index c5257f3813..e233c8b43b 100755 --- a/docs/apibuild.py +++ b/docs/apibuild.py @@ -26,6 +26,7 @@ included_files = { ignored_words = { "ATTRIBUTE_UNUSED": (0, "macro keyword"), + "ATTRIBUTE_SENTINEL": (0, "macro keyword"), "VIR_DEPRECATED": (0, "macro keyword"), "WINAPI": (0, "Windows keyword"), "__declspec": (3, "Windows keyword"), diff --git a/src/internal.h b/src/internal.h index bd1cfe680b..09c19eae6a 100644 --- a/src/internal.h +++ b/src/internal.h @@ -92,6 +92,17 @@ #define ATTRIBUTE_UNUSED __attribute__((__unused__)) #endif +/** + * ATTRIBUTE_SENTINEL: + * + * Macro to check for NULL-terminated varargs lists + */ +#ifndef ATTRIBUTE_SENTINEL +#if __GNUC_PREREQ (4, 0) +#define ATTRIBUTE_SENTINEL __attribute__((__sentinel__)) +#endif +#endif + /** * ATTRIBUTE_FMT_PRINTF * diff --git a/src/util/buf.h b/src/util/buf.h index 7d31cb2ac2..94ee8a3d10 100644 --- a/src/util/buf.h +++ b/src/util/buf.h @@ -41,7 +41,8 @@ void virBufferAdd(const virBufferPtr buf, const char *str, int len); void virBufferAddChar(const virBufferPtr buf, char c); void virBufferVSprintf(const virBufferPtr buf, const char *format, ...) ATTRIBUTE_FMT_PRINTF(2, 3); -void virBufferStrcat(const virBufferPtr buf, ...); +void virBufferStrcat(const virBufferPtr buf, ...) + ATTRIBUTE_SENTINEL; void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str); void virBufferURIEncodeString (const virBufferPtr buf, const char *str); diff --git a/src/util/ebtables.c b/src/util/ebtables.c index 60427d7099..20f33425be 100644 --- a/src/util/ebtables.c +++ b/src/util/ebtables.c @@ -175,7 +175,7 @@ ebtRulesNew(const char *table, return NULL; } -static int +static int ATTRIBUTE_SENTINEL ebtablesAddRemoveRule(ebtRules *rules, int action, const char *arg, ...) { va_list args; diff --git a/src/util/iptables.c b/src/util/iptables.c index 45628009ce..284f3c0f02 100644 --- a/src/util/iptables.c +++ b/src/util/iptables.c @@ -382,7 +382,7 @@ iptRulesNew(const char *table, return NULL; } -static int +static int ATTRIBUTE_SENTINEL iptablesAddRemoveRule(iptRules *rules, int action, const char *arg, ...) { va_list args; diff --git a/src/util/qparams.h b/src/util/qparams.h index 1a92048196..a2f5aa2e1a 100644 --- a/src/util/qparams.h +++ b/src/util/qparams.h @@ -38,10 +38,12 @@ struct qparam_set { }; /* New parameter set. */ -extern struct qparam_set *new_qparam_set (int init_alloc, ...); +extern struct qparam_set *new_qparam_set (int init_alloc, ...) + ATTRIBUTE_SENTINEL; /* Appending parameters. */ -extern int append_qparams (struct qparam_set *ps, ...); +extern int append_qparams (struct qparam_set *ps, ...) + ATTRIBUTE_SENTINEL; extern int append_qparam (struct qparam_set *ps, const char *name, const char *value);