Hi JeanHeyd,

I was involved this week in a fix for a bug I wrote some months ago
about a call to free(3) with a bad pointer.

The simplest reproducer is:

        $ cat strsep_bad.c
        #include <string.h>
        #include <stdio.h>
        #include <stdlib.h>

        int
        main(void)
        {
                char  *p;

                p = strdup("123;");
                strsep(&p, ";");
                free(p);

                puts("done");
        }

        $ cc -Wall -Wextra strsep.c 
        $ ./a.out 
        free(): invalid pointer
        Aborted

A fix for that program is to store a copy of the original pointer:

        $ cat strsep_good.c
        #include <string.h>
        #include <stdio.h>
        #include <stdlib.h>

        int
        main(void)
        {
                char  *p, *dup;

                p = dup = strdup("123;");
                strsep(&p, ";");
                free(dup);

                puts("done");
        }

While I could sympathize with 'defer', I'm wondering if it may simplify
some code avoiding goto's, at the expense of being obscurely dangerous
in other cases like this one.  I suspect one could blindly attempt to do
the following:

        $ cat strsep_bad_defer.c
        #include <string.h>
        #include <stdio.h>
        #include <stdlib.h>

        int
        main(void)
        {
                char  *p;

                p = strdup("123;");
                defer free(p);

                strsep(&p, ";");

                printf("done");
        }

Since 'p' in free(p) is evaluated after strsep(3), it is equivalent to
the first program, which is bogus.  I think goto better codifies the
evaluation order, and allows the programmer to think about what it's
doing.

So defer would only be good for the common case, which is usually
simple-enough that goto should be enough.  And it's bad in those corner
cases where you really to be careful.  I think I've changed my mind
about defer to not want it.

I wanted to have this thought written in a mailing list to be able to
reference it.


Have a lovely day!
Alex

-- 
<https://www.alejandro-colomar.es/>

Attachment: signature.asc
Description: PGP signature

Reply via email to