This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
Re: [PATCH] libdwfl: Fix wrong type to make gcc -fsanitize=undefined happy.
- From: Alexander Cherepanov <ch3root at openwall dot com>
- To: elfutils-devel at lists dot fedorahosted dot org
- Date: Thu, 23 Apr 2015 18:06:18 +0300
- Subject: Re: [PATCH] libdwfl: Fix wrong type to make gcc -fsanitize=undefined happy.
On 2015-04-21 23:26, Roland McGrath wrote:
> I think it's cleaner to do:
>
> [PATCH] libdwfl: Make dwfl_error.c C99-kosher.
>
> Signed-off-by: Roland McGrath <roland-/Z5OmTQCD9xF6kxbq+BtvQ(a)public.gmane.org>
> ---
> libdwfl/ChangeLog | 7 +++++++
> libdwfl/dwfl_error.c | 21 +++++++++++++++++----
> 2 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
> index d4cd3f5..045adb0 100644
> --- a/libdwfl/ChangeLog
> +++ b/libdwfl/ChangeLog
> @@ -1,3 +1,10 @@
> +2015-04-21 Roland McGrath <roland-/Z5OmTQCD9xF6kxbq+BtvQ(a)public.gmane.org>
> +
> + * dwfl_error.c (struct msgtable): Break type definition out of
> + the 'msgtable' initializer.
> + (msgtable): Make it a union of struct msgtable and a char array.
> + (msgstr): Use the full-table char array rather than the msg_0 entry.
> +
> 2015-04-02 Mark Wielaard <mjw-H+wXaHxf7aLQT0dZR+AlfA(a)public.gmane.org>
>
> * segment.c (insert): Check correct number of lookup_elts.
> diff --git a/libdwfl/dwfl_error.c b/libdwfl/dwfl_error.c
> index d9ca9e7..f46b160 100644
> --- a/libdwfl/dwfl_error.c
> +++ b/libdwfl/dwfl_error.c
> @@ -1,5 +1,5 @@
> /* Error handling in libdwfl.
> - Copyright (C) 2005-2010 Red Hat, Inc.
> + Copyright (C) 2005-2015 Red Hat, Inc.
> This file is part of elfutils.
>
> This file is free software; you can redistribute it and/or modify
> @@ -54,18 +54,31 @@ dwfl_errno (void)
> INTDEF (dwfl_errno)
>
>
> -static const struct msgtable
> +struct msgtable
> {
> #define DWFL_ERROR(name, text) char msg_##name[sizeof text];
> DWFL_ERRORS
> #undef DWFL_ERROR
> +};
> +
> +static const union
> +{
> + struct msgtable table;
> + char strings[
> +#define DWFL_ERROR(name, text) sizeof text +
> + DWFL_ERRORS
> +#undef DWFL_ERROR
> + + 0];
Extra plus in front of 0? Why not just use sizeof(struct msgtable)?
> } msgtable =
> {
> + .table =
> + {
> #define DWFL_ERROR(name, text) text,
> - DWFL_ERRORS
> + DWFL_ERRORS
> #undef DWFL_ERROR
> + }
> };
> -#define msgstr (&msgtable.msg_NOERROR[0])
> +#define msgstr (msgtable.strings)
Something like can be done without unions:
#define msgstr (*(char (*)[sizeof msgtable])&msgtable)
AFACT it's well-defined C and permits to perform bound checking.
--
Alexander Cherepanov