Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Mon, 25 Jun 2012 12:41:32 +0400
From: Solar Designer <solar@...nwall.com>
To: john-dev@...ts.openwall.com
Subject: Re: compiler warnings: make clean linux-x86-clang > /dev/null

On Mon, Jun 25, 2012 at 10:26:22AM +0200, Frank Dittrich wrote:
> But some definitely look suspicious:
> 
> 
> single.c:330:8: warning: array index of '1' indexes past the end of an
> array (that contains 1 elements)
>       [-Warray-bounds]
>                         if (first->data[1]) {
>                             ^           ~
> In file included from single.c:15:
> In file included from ./loader.h:16:
> ./list.h:19:7: note: array 'data' declared here
>         char data[1];
>              ^

This is as intended.  "struct list_entry" is allocated dynamically, with
just sufficient space to hold the actual "data".  An alternative would
have been to have extra pointer indirection here, which would waste a
little bit of memory on the pointer and be a little bit slower.

That said, I welcome suggestions on how to avoid scaring the compiler
with what looks to it like an out-of-bounds access.  A real concern is
that some compiler might think that since the behavior is undefined
anyway, it can optimize this out, or maybe trap it as a runtime fault.
IIRC, formally we're only allowed to take the address of the array
element just beyond the limit (e.g., &data[1] would be valid), but not
dereference it.

Alexander

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.