Funzioni Standard.. poco Standard

Proprio poco fa stavo parlando in chat con Dani, mentre io insultavo quelli che hanno creato la strcmp ( in quanto se gli si passa uno dei due parametri a NULL fa andare il programma in Segmentation Fault che è una bellezza ), mi ha detto che la strcmp oltre a fare il semplice confronto tra le due stringhe restituisce anche la differenza tra i caratteri, e proprio per questo lui l’aveva utilizzata per riordinare alfabeticamente i pacchetti in slackyd.

Allora non sapendo questa cosa da niubbo della situazione mi son messo a fare un test:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)
{
 if ( argc < 3 ) return 1;
 
 printf("Diff: `%d'\n", strcmp(argv[1], argv[2]));
 
 return 0;
}

Benissimo lo vado ad avviare e mi restituisce solo 0 ( uguali ), 1 o -1 ( non uguali ).. dopo vari attimi di stupore da parte sua, va a provare lo stesso identico codice e le stesse identiche stringhe passate come parametro sul suo computer e la funzione lì restituiva davvero la differenza tra le due stringhe!

Ora mi domando cosa renda così variabile una funzione standard che dovrebbbe avere lo stesso funzionamento su tutti i computer del mondo. La versione delle libc comunque era uguale giusto per cronaca. Da notare comunque anche che ho provato la strcasecmp che non dovrebbe far parte del C Standard, e restituisce la famosa differenza tra le due!

? Mah..

P.s.: Altra cosa che mi fa incazzare, se si passa un parametro null alla strcmp, o all’atoi perchè cavolo mi deve compromettere tutto il programma? cosa gli costa a quelli che hanno scritto la gnu c library mettere due piccolissime macro del tipo:

1
2
3
4
5
6
#define return_if_fail(cond) if ( !(cond) ) { \
                                  return; \
                             }
#define return_val_if_fail(cond, val) if ( !(cond) ) { \
                                           return (val); \
                                      }

per controllare che i parametri non siano nulli? BAH!

Nessun commento

(Required)
(Required, will not be published)