tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: proposal: some pointer and arithmetic utilities
On Thu 21 Mar 2013 at 18:12:03 +0000, Taylor R Campbell wrote:
> We have various structs of the form
>
> struct foo {
> struct bar f_bar;
> ...
> };
>
> and routines that are called like mumble(&foo->f_bar) and look like
>
> int
> mumble(struct bar *bar)
> {
> struct foo *foo = (void *)bar;
> ...
> }
>
> which assume that nobody has rearranged the fields of struct foo, an
> assumption which is neither semantically significant nor checked by
> the compiler; nor does it work with multiple different members from
> whose pointers we may want to find the containing object.
I would argue that all such mumble() should really be changed to
int
mumble(struct foo *foo)
{
struct bar *bar = &foo->f_bar;
...
}
since they are making that assumption already anyway.
That also works if f_bar isn't the first member in struct foo.
In C++ terms, mumble() is declared with a base class (struct bar) and
assumes it is actually called with a (specific) derived class (struct foo).
That is bad practice there, too.
The only advantage in C++ is that you can have a run-time type check for
it (at a price).
On Thu 21 Mar 2013 at 18:42:16 +0000, Taylor R Campbell wrote:
> /* multiple-evaluation-free roundup2/rounddown2 */
> #define roundup2(x, m) ((((x) - 1) | ((m) - 1)) + 1)
That seems to be typeof-free too, so the best of both worlds.
-Olaf.
--
___ Olaf 'Rhialto' Seibert -- The Doctor: No, 'eureka' is Greek for
\X/ rhialto/at/xs4all.nl -- 'this bath is too hot.'
Home |
Main Index |
Thread Index |
Old Index