OVH Cloud OVH Cloud

bug dans cpp??

4 réponses
Avatar
Saïd
Bonjour,

D'apres le man de cpp sous Panther:
cpp [-Dmacro[=defn]...] [-Umacro]
[-Idir...] [-Wwarn...]
[-M|-MM] [-MG] [-MF filename]
[-MP] [-MQ target...] [-MT target...]
[-x language] [-std=standard]
infile outfile
mais /usr/bin/cpp est un script qui contient:
--------DEBUT
PATH=/usr/bin:/bin
CPP="/usr/libexec/gcc/darwin//usr/bin/arch/default/cpp"
ALST="-traditional -D__GNUC__"
NSI=no
OPTS=""
INCS=""
FOUNDFILES=no

while [ $# -gt 0 ]
do
A="$1"
shift

case $A in
-nostdinc)
NSI=yes
;;
-traditional)
;;
-I*)
INCS="$INCS $A"
;;
-U__GNUC__)
ALST=cho $ALST | sed -e 's/-D__GNUC__//'
;;
-imacros|-include|-idirafter|-iprefix|-iwithprefix)
INCS="$INCS '$A' '$1'"
shift
;;
-*)
OPTS="$OPTS '$A'"
;;
*)
FOUNDFILES=yes
if [ $NSI = "no" ]
then
NSI=skip
fi
eval $CPP $ALST $INCS $OPTS $A || exit $?
;;
esac
done

if [ $FOUNDFILES = "no" ]
then
# read standard input
if [ $NSI = "no" ]
then
INCS="$INCS -I/usr/include"
fi
eval exec $CPP $ALST $INCS $OPTS
fi

exit 0
-----------FIN

Ce qui veux dire que je fait
cpp in.c out.i

la ligne
eval $CPP $ALST $INCS $OPTS $A || exit $?
sera executee deux fois et la sortie se fera sur la sortie standard au lieu
d'etre dant out.i comme semble le dire le man.

Je pense que cette ligne doit etre remplacee par:
eval $CPP $ALST $INCS $OPTS $A $@ && exit $?

Qu'en pense-vous?

--
Saïd.
C programmers never die - they're just cast into void.

4 réponses

Avatar
DINH Viêt Hoà

Je pense que cette ligne doit etre remplacee par:
eval $CPP $ALST $INCS $OPTS $A $@ && exit $?


pourquoi le && à la place du || ?

le || me semble très bien.

Si eval $CPP ... réussi, l'évaluation paresseuse fait que exit est
appelé avec la dernière de valeur de retour.

je verrai donc plus quelque chose du genre :

eval $CPP $ALST $INCS $OPTS $A "$1" || exit $?

--
DINH V. Hoa,

"Le monde n'attend que toi ! " -- FiLH

Avatar
Saïd
DINH Viêt Hoà :

Je pense que cette ligne doit etre remplacee par:
eval $CPP $ALST $INCS $OPTS $A $@ && exit $?


pourquoi le && à la place du || ?

le || me semble très bien.

Si eval $CPP ... réussi, l'évaluation paresseuse fait que exit est
appelé avec la dernière de valeur de retour.



Ben non justement. Si le eval se passe bien le exit n'est pas lance. Par
contre ma solution est mauvaise dans le cas ou le eval se passe mal. (||
signifie "ou" et donc si sont premier argument est vrai (ca se passe bien)
alors il n'y a pas besoin d'evaluer le reste).

Mais le plus important c'est le decalage entre ce que dit le man et ce qui
se passe avec ce scipt.


--
Saïd.
C programmers never die - they're just cast into void.


Avatar
DINH Viêt Hoà

DINH Viêt Hoà :

Je pense que cette ligne doit etre remplacee par:
eval $CPP $ALST $INCS $OPTS $A $@ && exit $?


pourquoi le && à la place du || ?

le || me semble très bien.

Si eval $CPP ... réussi, l'évaluation paresseuse fait que exit est
appelé avec la dernière de valeur de retour.



Ben non justement. Si le eval se passe bien le exit n'est pas lance. Par
contre ma solution est mauvaise dans le cas ou le eval se passe mal. (||
signifie "ou" et donc si sont premier argument est vrai (ca se passe bien)
alors il n'y a pas besoin d'evaluer le reste).


oui, effectivement, je devais avoir bu quand j'ai écrit ça.
je pense qu'il faut ne pas évaluer le reste dans tous les cas.

un exec eval $CPP ... irait donc bien.

--
DINH V. Hoa,

"Le monde n'attend que toi ! " -- FiLH



Avatar
Laurent Wacrenier
Saïd écrit:
mais /usr/bin/cpp est un script qui contient:


Ouch. Utilise "gcc -E", appeler cpp directement est un exercice
délicat sur certains systèmes.