• [^] # Re: Hmm :/

    Posté par (site web personnel) . En réponse au journal Entretient du noyau Linux. Évalué à 7.

    contrairement au goto, qui de plus peu être utilisé à tout va puisque son utilisation n'est pas limité par sa sémantique.

    goto est limité à la fonction locale.

    Ah bon tu remplacent le mot break/continue/return par un goto et tu comprends mieux ? Je captes pas... ok y'a moins de lettres... break/continue/return sont des cas particulier de goto, ont une sémantique et une utilisation précise qui fait que tout le monde les comprend, notamment le compilateur (et c'est pas négligeable).

    Prends une fonction quelconque qui alloue plusieurs trucs (c'est courant dans le kernel) et qui vérifie les allocations en question (c'est pas courant ailleurs que dans le kernel).

    ma_fonction() {
    resultat = NULL;
    if ((truc_a = malloc(stuff)) == NULL)
    return NULL;
    if ((truc_b = malloc(stuff)) == NULL) {
    free(truc_a);
    return NULL;
    }
    if ((truc_c = malloc(stuff)) == NULL) {
    free(truc_a);
    free(truc_b);
    return NULL;
    }

    if ((truc_d = malloc(stuff)) == NULL) {
    free(truc_a);
    free(truc_b);
    free(truc_c);
    return NULL;
    }

    if (test-je-veux-un-lock == PAS_LOCK) {
    free(truc_a);
    free(truc_b);
    free(truc_c);
    free(truc_d);
    return NULL;
    }

    /* fait des trucs ... */
    rend_le_lock();
    free(truc_d);
    free(truc_c);
    free(truc_b);
    free(truc_a);
    return RESULTAT;
    }

    Tu as aussi la méthode avec de multiples if()s imbriqués, totalement illisible puisque le cas échéant, ton code principal sera 4 niveaux plus bas et ton code de gestion d'erreur prendra toute la place.

    Maintenant prends la version gotoisée:
    ma_fonction()
    {
    resultat = NULL;
    if ((truc_a = malloc(stuff)) == NULL)
    goto bail;

    if ((truc_b = malloc(stuff)) == NULL)
    goto bail_a;

    if ((truc_c = malloc(stuff)) == NULL)
    goto bail_b;

    if ((truc_d = malloc(stuff)) == NULL)
    goto bail_c;

    if (test-je-veux-un-lock == PAS_LOCK)
    goto bail_d;

    /* fait des trucs ... */

    rend_le_lock();

    bail_d:
    free(truc_d);
    bail_c:
    free(truc_c);
    bail_b:
    free(truc_b);
    bail_a:
    free(truc_a);

    return RESULTAT;
    }


    Tu veux une explication de l'intérêt de la chose? Ou tu as compris le truc?

    Les profs t'apprennent que les variables globales c'est mal, que les goto c'est mal, etc, parce qu'ils t'apprennent mal.