Re: is this a valid approach to aliasing?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Robert William Fuller wrote:

Naturally, when I started trying to call this function, I started getting the type-punned pointer aliasing warnings. The code in question looked roughly like this:

static opt_param_t *shrtOpts, *longOpts;

rc = reallocItems((void **) &shrtOpts, sizeof(opt_param_t), &shrtOptAlloc, numShrtOpts, newShrtOpts, shrtOptHint);

Obviously, this breaks the aliasing rules. I read that I could work around this by casting through a union. I settled on this approach, but I'm not sure if it is valid, or if I'm merely masking the problem:

typedef union _opt_param_alias_t {

    opt_param_t *o;
    void *v;

} opt_param_alias_t;

rc = reallocItems(&((opt_param_alias_t *) &shrtOpts)->v, sizeof(opt_param_t), &shrtOptAlloc, numShrtOpts, newShrtOpts, shrtOptHint)

It really isn't necessary to do this.  The rule is that you mustn't use
a pointer cast to create an lvalue of incompatible type.  So, do this:

static opt_param_t *shrtOpts, *longOpts;

void *p1;

rc = reallocItems(&p1, sizeof(opt_param_t),
   &shrtOptAlloc, numShrtOpts, newShrtOpts, shrtOptHint);
shrtOpts = p1;

Andrew.



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux