• [^] # Re: Reallocation sans free ?

    Posté par . En réponse au message ma j'galère sur un simple free sur un string. Évalué à 1.

    Bonjour Mr Marec,
    je vais tenter d'expliquer cette partie du code:
    1. result: résultat en chaîne de caractères des opérations précédentes de l'exécution de la chaîne de modules courante - je nommerai ces dernières "listing". Il est censé être ré-allouer dès que nécessaire et libéré après conservation dans le tableau process_datas->result de ma structure process_datas, ce à la fin de l'exécution de chaque listing.
    2. size: taille du string result nécessaire à la fonction fd_readn pour le calcul d'un espace supplémentaire éventuel - le but étant de limiter les libérations.
    1. len: somme des longueurs des strings à concaténer ( ne peut pas être égal à 0 ):
    - code de la fonction interne concat revisité:

     int len = 0;
     for(int l = 1; l < p->args[*i][1] - 1; l++)
     len += strlen(p->commands[*i][l]);
     if(*size < len){
     *size = len;
     if(!*size)
     *result = calloc(len + 1, sizeof(char));
     else
     *result = realloc(*result, (len + 1) * sizeof(char));
     }
     strncpy(*result, p->commands[*i][1], strlen(p->commands[*i][1]));
     for(int l = 2; l < p->args[*i][1] - 1; l++)
     {
     strncat(*result, p->commands[*i][l], strlen(p->commands[*i][l]));
     }
     ++(*i);
     return 256;
    

    remarquez l'incrémentation du i de la boucle de process_exec et dont je vérifie la validité dans cette même dernière fonction ( améliorée ), afin d'éviter de passer par le pipe si jamais le listing courant se terminait par une commande internal:

     if((ret = process_datas_internal(p, &result, &size, &i)) == EXIT_FAILURE)
     {
     free(result);
     perror("Bad internal process");
     return EXIT_FAILURE;
     }else if(i == p->size)
     break;
    

    Mon programme se comporte mieux ( il fonctionne ). Par contre, je vais devoir m'arracher les cheveux pour trouver le pointeur non libéré que m'indique valgrind:

    ==26878== LEAK SUMMARY:
    ==26878== definitely lost: 128 bytes in 1 blocks
    

    merci encore une fois de votre attention. Si vous souhaitez collaborer à la conception de ce module destiné à la création de nouveaux modules... n'hésitez pas à m'en faire part.