Files
TD2_DEV51_Qualite_Algo/compte-rendu.md
2025-09-15 17:23:15 +02:00

6.8 KiB

Damien Riera - Tom Momméja - Gaston Chenet

daemon.c

create_daemon()

cette fonction a une complexité de 4

ping_request()

Cette fonction a une complexité de 2

send_check()

Cette fonction a une complexité de 3

check_keep_working()

Cette fonction a une complexité de 4

daemon_work()

Cette fonction a une complexité de 3

db-sqlite.c

db_connect() - db_disconnect() - insert_hourly_report()

Toutes ces fonctions ont une complexité de 1

ping-report.c

main()

Cette fonction a une complexité de 4

stats.c

get_ping_from_temp_log()

Cette fonction a une complexité aux alentours de 15

Diagramme de complexité

write_ping_log()

Cette fonction a une complexité de 4

set_stats_ping()

Cette fonction a une complexité de 9

Diagrame de complexité

utils.c

write_pid_file()

Cette fonction a une commplexité de 2

remove_file()

Cette fonction a une complexité de 1

Réduire la complexité de set_stats_ping()

/* Check if the ping is flagged as LOSS */
if(strcmp(read_line,"LOSS") == 0){
    nb_loss++;
}else{
    /* Evaluate the ping as a double */
    ping = strtod(read_line,NULL);
    /* Test null ping */
    if(ping < 0.1){
        /* Ignore null ping */
    }
    /* ... */
}

à:

/* Evaluate the ping as a double */
ping = strtod(read_line,NULL);
/* Check if the ping is flagged as LOSS */
if(strcmp(read_line,"LOSS") == 0 && ping < 0.1){
    nb_loss++;
}
/* ... */

Réduire la complexité de get_ping_from_temp_log()

/*
    -- get_ping_from_temp_log --
    Desc :
        Function which get the ping from a temp log containing the last ping did by the program
    In-param :
        None
    Out-param :
        None
    Return value :
        Ping value as a string or NULL if an error occured
*/
/*@null@*/char* get_ping_from_temp_log(){

    /* Variables */
    FILE* fd = NULL;
    char* read_line = NULL;
    size_t n = 0;
    size_t nmatch = 2;
    regex_t *p_reg;
    regmatch_t* pmatch;
    char* ping = NULL;
    int start;
    int end;
    size_t size_ping;

    /* regex struct memory allocation */
    p_reg = (regex_t *) malloc(sizeof(*p_reg));
    if(p_reg == NULL){
        return ping; /* NULL */
    }

    /* Open ping log file */
    fd = fopen("/var/log/ping-report/last-ping.log","r");
    if(fd == NULL){
        free(p_reg);
        return ping; /* NULL */
    }

    /* Construct regex to get ping from log file */
    if(regcomp(p_reg,"time=(.*) ms",REG_EXTENDED) != 0){
        if(p_reg != NULL){
            free(p_reg);
        }
        (void) fclose(fd);
        return ping; /* NULL */
    }

    /* match info memory allocation */
    pmatch = malloc(sizeof(*pmatch) * nmatch);
    if(pmatch == NULL){
        (void) fclose(fd);
        regfree(p_reg);
        free(p_reg);
        return ping; /* NULL */
    }

    /* Read file */
    while(getline(&read_line,&n,fd) != -1){
        
        if(read_line == NULL){
            break;
        }

        /* Exec regex to find ping */

        if(regexec(p_reg,read_line,nmatch,pmatch,0) == 0){

            /* Extract ping position from read line */
            start = (int) pmatch[1].rm_so;
            end = (int) pmatch[1].rm_eo;
            size_ping = (size_t) (end - start);

            /* ping string memory allocation */
            ping = malloc(sizeof(char) * (size_ping+2));
            if(ping == NULL){
                free(read_line);
                read_line = NULL;
                n = 0;
                break;
            }

            /* Create ping string */
            (void) strncpy(ping, &read_line[start], size_ping);
            ping[size_ping]='\n';
            ping[size_ping+1]='\0';

            /* Free memory */
            free(read_line);
            read_line = NULL;
            n = 0;
            break;
        }

        free(read_line);
        read_line = NULL;
        n = 0;
    }

    /* free allocated memory */
    regfree(p_reg);
    free(p_reg);
    free(pmatch);
    if(read_line != NULL){
        free(read_line);
    }

    (void) fclose(fd);

    /* ping may be null, then it must mean that the ping request was lost */
    return ping;
}

à:

char* prepare(regex_t *p_reg, FILE* fd, regmatch_t* pmatch, char* ping, size_t nmatch){
    /* regex struct memory allocation */
    p_reg = (regex_t *) malloc(sizeof(*p_reg));
    if(p_reg == NULL){
        return ping; /* NULL */
    }

    /* Open ping log file */
    fd = fopen("/var/log/ping-report/last-ping.log","r");
    if(fd == NULL){
        free(p_reg);
        return ping; /* NULL */
    }

    /* Construct regex to get ping from log file */
    if(regcomp(p_reg,"time=(.*) ms",REG_EXTENDED) != 0){
        if(p_reg != NULL){
            free(p_reg);
        }
        (void) fclose(fd);
        return ping; /* NULL */
    }

    /* match info memory allocation */
    pmatch = malloc(sizeof(*pmatch) * nmatch);
    if(pmatch == NULL){
        (void) fclose(fd);
        regfree(p_reg);
        free(p_reg);
        return ping; /* NULL */
    }

    return NULL; /* success */
}

int loop_line(char* read_line)
{
    int start;
    int end;
    size_t size_ping;

    if(read_line == NULL){
        return -1;
    }

    /* Exec regex to find ping */

    if(regexec(p_reg,read_line,nmatch,pmatch,0) == 0){

        /* Extract ping position from read line */
        start = (int) pmatch[1].rm_so;
        end = (int) pmatch[1].rm_eo;
        size_ping = (size_t) (end - start);

        /* ping string memory allocation */
        ping = malloc(sizeof(char) * (size_ping+2));
        if(ping == NULL){
            free(read_line);
            read_line = NULL;
            n = 0;
            return -1;
        }

        /* Create ping string */
        (void) strncpy(ping, &read_line[start], size_ping);
        ping[size_ping]='\n';
        ping[size_ping+1]='\0';

        /* Free memory */
        free(read_line);
        read_line = NULL;
        n = 0;
        return 0; /* success */
    }

    free(read_line);
    read_line = NULL;
    n = 0;
    return 1;
}

char* get_ping_from_temp_log(){
    /* Variables */
    FILE* fd = NULL;
    char* read_line = NULL;
    size_t n = 0;
    size_t nmatch = 2;
    regex_t *p_reg;
    regmatch_t* pmatch;
    char* ping = NULL;

    if(prepare(p_reg, fd, pmatch, ping, nmatch) != NULL){
        return ping; /* NULL */
    }

    /* Read file */
    while(getline(&read_line,&n,fd) != -1){
        if (loop_line(read_line) != 1){
            break;
        }
    }

    /* free allocated memory */
    regfree(p_reg);
    free(p_reg);
    free(pmatch);
    if(read_line != NULL){
        free(read_line);
    }

    (void) fclose(fd);

    /* ping may be null, then it must mean that the ping request was lost */
    return ping;
}

On répartie la fonction en 3 fonctions pour réduire la complexité.