potentially incorrect conversion of pointer to unsigned long

Cameron Simpson cs at cskk.id.au
Sat Jun 22 23:01:43 UTC 2019


On 22Jun2019 21:14, vincent lefevre <vincent at vinc17.org> wrote:
>On 2019-06-22 12:40:39 +0200, Oswald Buddenhagen wrote:
>> On Sat, Jun 22, 2019 at 09:42:36AM +0200, Vincent Lefevre wrote:
>> >         p->init = (unsigned long) safe_strdup (* ((char **) p->data));
>> >
>> > IMHO, the best solution for safety would be to use a union (I think
>> > that this would require the use of C99 designators for the MuttVars
>> > initialization). Otherwise check (uintptr_t) -1 <= (unsigned long) -1
>> > in configure.
>> >
>> it's easier to just use !! or put != NULL at the end instead of the cast.
>
>AFAIK, the value itself matters, not just the fact that it is
>non-zero.

If I were doing this in Python or any other object oriented language I'd 
have a special sentinel value of the right type i.e. _not_ some magic -1 
value we expect to not match any other pointer-as-integer value and also 
not NULL, but an actual distinct special purpose (char*).

So how about this:

    #define UNSET_CHAR_PTR "<unset>"

and to use UNSET_CHAR_PTR instead of (uintptr_t)-1 and (unsigned 
long)-1.

Specificly, this way we (a) avoid doing any casts and (b) avoid any need 
for a union and its associated cognitive dissonance and (c) avoid a 
magic number in the code (the -1, in whatever form).

I'm totally serious about this, BTW.

Cheers,
Cameron Simpson <cs at cskk.id.au>


More information about the Mutt-dev mailing list