On Wed, Nov 04, 2009 at 06:49:47PM +0100, Paolo Bonzini wrote:
> This patch adds a (macro-wrapped) sentinel attribute to functions
> that take a NULL-terminated variable argument list.  This is a nice
> debugging aid.
> 
> * src/internal.h (ATTRIBUTE_SENTINEL): New.
> * 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.
> ---
>  src/internal.h      |   11 +++++++++++
>  src/util/buf.h      |    3 ++-
>  src/util/ebtables.c |    2 +-
>  src/util/iptables.c |    2 +-
>  src/util/qparams.h  |    6 ++++--
>  5 files changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/src/internal.h b/src/internal.h
> index bd1cfe6..09c19ea 100644
> --- a/src/internal.h
> +++ b/src/internal.h
> @@ -93,6 +93,17 @@
>  #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
>   *
>   * Macro used to check printf like functions, if compiling
> diff --git a/src/util/buf.h b/src/util/buf.h
> index 7d31cb2..94ee8a3 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 60427d7..20f3342 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 4562800..284f3c0 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 1a92048..a2f5aa2 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);
>  
> -- 

ACK

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

--
Libvir-list mailing list
Libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to