Re: zsh segfault, Was Re: [SSFR] quel langage ?

[ Thread Index | Date Index | More debianworld.org/shellscript-fr Archives ]


On 2005-12-02 09:38:13 +0000, Xavier Gachon wrote:
> On Fri, Dec 02, 2005 at 01:49:32AM +0000, Vincent Lefevre wrote:
> > On 2005-12-02 01:11:23 +0000, Xavier Gachon wrote:
> > > si on causait un peu de zsh qui segfault toujours d'entrée sur un bete:
> > > 
> > > $ echo false > ./file; f () { . ./file || echo exit > ./file ; f ; } ; f &
> > > 
> > > ou f () { f; }; f; pour un test plus court, un peu partout
> > > ou j'ai pu essayer en 2.4.* (5 en particulier), des utilisateur
> > > pour tester sur divers systemes et versions ? :-)
> > 
> > Un appel récursif infini, c'est normal que ça plante au bout d'un
> > moment.
> 
> Si tu avais pris la peine de lire:

Désolé, mais vu que tu donnes peu de détails...

> 1) cela segfault _d'entrée_ il n'y a pas d'appels recursifs
>    ou alors la stack de zsh fait quelques octects a tout casser %)

Si ça segfaulte au premier appel, alors c'est un bug, auquel cas, mets
à jour ton zsh. Si tu as juste testé comme ça et que ça segfaulte au
bout d'une fraction de seconde avec cet exemple, c'est normal avec la
vitesse des processeurs actuels (et l'efficacité des Unix). Tu peux
essayer ceci:

f () { echo $[++i]; sleep 1; f; }; f;

> 2) la recursion du premier exemple se limite a 2 appels, l'appel
>    initial qui genere la condition d'arret de l'appel recursif
>    qui suit, cela segfault tout de meme :)

Non, elle est infinie. Avec

f () {
        echo $[++i]
        cat file
        sleep 1
        . ./file || echo exit >| ./file
        f
}

j'obtiens:

1
false
2
exit
3
exit
4
exit
5
exit
6
exit

Ça me semble être un bug, ceci dit.

> 3) ce ne sont pas des appels recursif mais tail recursif executables
>    en espace constant par trampolining

zsh n'optimise apparemment pas (pour une bonne raison, peut-être).
Il y a bien des appels récursifs.

>    (dans le pire des cas! car c'est du shell et il n'y a pas donc
>    pas les contraintes que tentent de gerer comme il peuvent les
>    compilos C les empechant de creer des tails recursions en espace
>    constant :)

Tu oublies qu'il peut y avoir des traps, et des choses compliquées
avec les redirections, des processus qui seraient mis en background,
etc. Ce n'est pas si simple. Pas sûr qu'il n'y ait pas de nettoyage
à faire à la fin de chaque appel.

>    mais je ne m'attend evidemment pas a de telles
>    «««optimisations»»» de la part d'un shell, cependant je ne
>    m'attend pas non plus a ce qu'il plante en 1 seul appel recursif,
>    d'ou la question :-)

Pour le plantage au bout d'un appel, upgrade, mais je n'ai jamais vu ça.

-- 
Vincent Lefèvre <vincent@xxxxxxxxxx> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/