dirname.c


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef FIXBUG
#include <libgen.h>
#endif

int main( int argc, char ** argv )
{
  if (argc >1)
    {
      char * cp;
      cp = strdup(argv[1]);
      char * dname = dirname(cp);
      printf("%s(%s)=%s\n", argv[0], argv[1], dname);
    }

  exit(0);
}

test.sh


gcc dirname.c -o dnbuggy
gcc -D FIXBUG dirname.c -o dn
for dir in  a/b/f a/f /a/f /a/b/c/f/ f
do
./dnbuggy $dir || echo "ERROR ./dnbuggy $dir"  
./dn $dir
done

l'éxécution de test.sh :

dirname.c: In function ‘main’:
dirname.c:14:22: warning: initialization makes pointer from integer without a cast [enabled by default]
./dnbuggy(a/b/f)=a/b
./dn(a/b/f)=a/b
./dnbuggy(a/f)=a
./dn(a/f)=a
./dnbuggy(/a/f)=/a
./dn(/a/f)=/a
./dnbuggy(/a/b/c/f/)=/a/b/c
./dn(/a/b/c/f/)=/a/b/c
./test.sh : ligne 3 :  6463 Erreur de segmentation  ./dnbuggy $dir
ERROR ./dnbuggy f
./dn(f)=.

Seule la compilation qui oublie de d'inclure libgen.h plante en SEGFAULT en 64bits et uniquement avec un nom de chemin qui ne contient aucun /...

Et oui, il faut vraiment lire les warnings, parce que la recherche du bug elle, coute plus cher qu'un man 3 dirname.