lkml.org 
[lkml]   [2000]   [Jul]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: SIGSEGV on fclose
    ak@suse.de (Andi Kleen) writes:

    >The alternative is the error prone and ugly:

    >if (a = alloca()) {
    > if (b = allocb()) {
    > if (c = allocc()) {
    > if (d =allocd()) {
    > do_real_work();
    > freed(d);
    > }
    > freec(c);
    > }
    > freeb(b);
    > }
    > freea(a);
    >}

    >which is IMHO just asking for obscure bugs in error paths.

    >/* a b c d are NULL */
    >a = alloca();
    >b = allocb();
    >c = allocc();
    >d = allocd();
    >if (a && b && c && d)
    > do_real_work();
    >freea(a);
    >freeb(b);
    >freec(c);
    >freed(d);

    >Which one do you prefer ?

    I would prefer the correct way:

    atype *a = NULL;
    btype *b = NULL;
    ctype *c = NULL;
    dtype *d = NULL;

    if(!(a= alloca()))
    report_error_and_exit(a);
    if(!(b= allocb()))
    report_error_and_exit(b);
    if(!(c= allocc()))
    report_error_and_exit(c);
    if(!(d= allocd()))
    report_error_and_exit(d);

    do_real_work();

    freea(a);
    freeb(b);
    freec(c);
    freed(d);

    void report_error_and_exit(error)
    {
    whine("We had an error on", error);

    if(a)
    freea(a);
    if(b)
    freeb(b);
    if(c)
    freec(c);
    if(d)
    freed(d);

    exit();
    }

    Both of your examples are asking for trouble, hacker-style. If've seen too
    much badly written, "clever" code crash in various ways to like any of your
    examples. One of the main disadvantages of "free software". Sorry.

    >About the only argument I see is to make one undefined behaviour in ISO
    >C crash instead of behave sanely to point out a potential portability
    >problem to some hosts (e.g. most Unixes seem to get this correct) early.
    >I prefer a sane behaviour instead though.

    Congrats, you just found out that there is more to life than Linux. :-)


    Regards
    Henning
    --
    Dipl.-Inf. (Univ.) Henning P. Schmiedehausen -- Geschaeftsfuehrer
    INTERMETA - Gesellschaft fuer Mehrwertdienste mbH hps@intermeta.de

    Am Schwabachgrund 22 Fon.: 09131 / 50654-0 info@intermeta.de
    D-91054 Buckenhof Fax.: 09131 / 50654-20

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.rutgers.edu
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:57    [W:0.021 / U:0.232 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site