URL: https://linuxfr.org/news/sortie-de-perl-5-30-0 Title: Sortie de Perl 5.30.0 Authors: contra-sh ZeroHeure, palm123, thomasv, Davy Defaud, Nils Ratusznik, Ysabeau đŸ§¶, BenoĂźt Sibaud et M5oul Date: 2019ćčŽ06月26æ—„T08:52:16+02:00 License: CC By-SA Tags: perl, benjamin_bayart, linus_torvalds, alan_cox, fortran, ubuntu et perl5 Score: 50 [Perl](https://www.perl.org/) est un langage gĂ©nĂ©raliste crĂ©e en 1987 par [Larry Wall](https://fr.wikipedia.org/wiki/Larry_Wall). « _Perl continue de prospĂ©rer dans sa troisiĂšme dĂ©cennie grĂące Ă  une communautĂ© d’utilisateurs et de dĂ©veloppeurs trĂšs dynamique._ », _dixit_ [perldelta](https://metacpan.org/pod/distribution/perl/pod/perldelta.pod#Acknowledgements). Perl est distribuĂ© sous une double licence : [Artistic Licence](https://opensource.org/licenses/Artistic-2.0) et [GPL v1+](https://www.gnu.org/licenses/gpl-3.0.html). La plupart des modules du CPAN [suivent Ă©galement ce mĂȘme traitement](https://www.cpan.org/misc/cpan-faq.html#How_is_Perl_licensed). ![Perl 5 raptor](https://camo.githubusercontent.com/039c0b770fdaff0f1418c5afa4296dfaba5f2875/68747470733a2f2f7261772e6769746875622e636f6d2f6b726169682f7065726c2d726170746f722f6d61737465722f6578616d706c652e706e67) _Perl 5 raptor de [kraih](https://github.com/kraih/perl-raptor), licence [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)_ En 2010, on parlait de « Perl moderne » pour mettre en Ă©vidence la modernisation du langage et des pratiques autour de celui‐ci (dans le livre _[Modern Perl](http://modernperlbooks.com/)_, ainsi que _[Perl Moderne](https://www.developpez.net/forums/d1009158/autres-langages/perl/livres/perl-moderne-l-essentiel-pratiques-actuelles/)_, Ă©crit par trois [_mongueurs_](https://fr.wikipedia.org/wiki/Perl_Mongers) français, ou encore le [module Modern::Perl](https://metacpan.org/pod/Modern::Perl)). Nous sommes probablement Ă  prĂ©sent dans l’ùre « post‐moderne de Perl » :-) Un certain nombre de dĂ©pĂȘches ont Ă©tĂ© postĂ©es sur [_LinuxFr.org_](https://linuxfr.org/) Ă  propos des Ă©volutions du langage. _N. D. M. : cette longue dĂ©pĂȘche a Ă©tĂ© scindĂ©e en deux : l’abondante bibliographie est [dans une dĂ©pĂȘche sĂ©parĂ©e](/news/pour-tout-savoir-du-perl-post-moderne)._ ---- [Perl](https://www.perl.org/) [Perldelta 5.30.0 (dernier journal des modifications)](https://metacpan.org/pod/distribution/perl/pod/perldelta.pod) [metaCPAN ](https://metacpan.org/) ---- #Le dĂ©veloppement de Perl ## PrĂ©cĂ©dentes dĂ©pĂȘches sur les sorties des versions de Perl - [Sortie de Perl 5.10](https://linuxfr.org/news/sortie-de-perl-5100) en 2007. - [Sortie de Perl 5.12](https://linuxfr.org/news/perl-512-une-constante-jeunesse) en 2010. - [Sortie de Perl 5.14](https://linuxfr.org/users/jbbourgoin/journaux/sortie-de-perl-5140) en 2011. - [Sortie de Perl 5.16](https://linuxfr.org/news/perl-5-16-0) en 2012. - [Sortie de Perl 5.18, 5.20 et 5.22](https://linuxfr.org/news/sortie-de-perl-5-22-0) (5.18 en 2013, 5.20 en 2014, 5.22 2015). ## Autres versions de Perl - [Perl 6](https://perl6.org/) le 25 dĂ©cembre 2015. Attention *Perl 6 n'est pas Perl 5* et la comparaison entre Python 3/Perl 6 et Python 2/ Perl 5 ne tient pas ;). - Perl 5.24 en 2016. - Perl 5.26 en 2017. - Perl 5.28 en 2018. - Perl 5.30 en 2019. (une version majeure par an, [lien WikipĂ©dia sur l'historique des versions de Perl](https://en.wikipedia.org/wiki/Perl_5_version_history)) Perl 6... Eh bien c'est compliquĂ©... Perl 6 est trop loin de Perl 5 pour ĂȘtre vraiment la version suivante de Perl 5. Et certains ont demandĂ© Ă  [changer le nom de Perl 6](https://rakudo.party/post/A-Request-to-Larry-Wall-to-Create-a-Language-Name-Alias-for-Perl-6). Et Larry Wall a acceptĂ© en donnant l'alias [Raku](https://medium.com/@virtuallysue/larry-wall-announces-alternative-name-raku-for-perl-6-cd0ccf6f649c) (du nom de la machine virtuelle). La machine virtuelle n'est plus [Parrot](https://en.wikipedia.org/wiki/Parrot_virtual_machine) ni [pugs](https://fr.wikipedia.org/wiki/Pugs), mais [Rakudo](https://rakudo.org/) (qui est en fait [la continuitĂ©/spĂ©cialisation de Parrot pour Perl 6](https://fr.wikipedia.org/wiki/Rakudo_Perl)). ## Releasing flow Comme on peut le voir sur la page [d'historique des versions de Perl](https://en.wikipedia.org/wiki/Perl_5_version_history) (ou mieux dans [perlhist](https://perldoc.perl.org/perlhist.html)), le versioning de Perl a changĂ© au cours des annĂ©es. De **5.000** a **5.005** puis la version suivante est devenue **5.6.0**. À partir de la **5.10.0** les releases sont devenues annuelles et une version avec un mineur impair est une version de dev. Rappel **Perl 5.10.0** est donc **Perl Majeur.Mineur.Patch** selon la rĂšgle du [versioning semantique](https://edutechwiki.unige.ch/fr/Versionnage_s%C3%A9mantique). Les *version patchs* servent Ă  fixer gĂ©nĂ©ralement les *problĂšmes de sĂ©curitĂ©* (**CVE-...**) et les *rĂ©gressions*. Attention : des _versions patch_ continuent d'apparaĂźtre aprĂšs la sortie de la version stable suivante. Par exemple, seule **5.24.1** (14 janvier 2017) Ă©tait sortie au moment la la sortie de **5.26.0** (30 mai 2017). ![Frise des versions de Perl](https://i.imgur.com/7dwJu4o.png) (il y a d'autres versions non reprĂ©sentĂ©es sur cette frise) *bleadperl* est le nom donnĂ© Ă  la derniĂšre version de la branche de dev de Perl 5. Par exemple, on peut lire "testĂ© avec bleadperl" ou "dois-je cibler bleadperl pour mon patch ?". La version de perl fournie avec une distribution se nomme le *perl vendor*. Le *perl vendor* est empaquetĂ© par la distribution. On peut dĂ©cider de ne pas utiliser cette version mais pourquoi ? - Parce qu'on souhaite utiliser une version **plus rĂ©cente**. - Pour **figer** la version Perl utilisĂ©e. - Parce qu'on veut une version de Perl avec des **flags de compilation diffĂ©rents**. - Pour **Ă©viter** d'utiliser un **perl vendor** [qui a Ă©tĂ© mal packagĂ©](http://modernperlbooks.com/mt/2012/01/avoiding-the-vendor-perl-fad-diet.html). On peut donc [compiler notre propre version de Perl]((https://metacpan.org/pod/distribution/perl/INSTALL)) ou mĂȘme utiliser le [gestionnaire de binaires perlbrew](https://perlbrew.pl/) (ou [plenv](https://github.com/tokuhirom/plenv)). ## Stuffed pumpkin et core dev team Le *gardien de la citrouille empaillĂ©e* ou le *possesseur de la citrouille Ă  patch* ou encore le *pumpking* (contraction de pumpkin et king) est en quelque sorte le mainteneur principal (ou mainteneur en chef comme le dit ce [commentaire linuxfr](https://linuxfr.org/news/sortie-de-perl-5-22-0#comment-1607333)) ou release manager ou tout simplement celui qui fusionne le code et coordonne la release. Il s'agit depuis quelques releases de **Sawyer X** ([profil CPAN](https://metacpan.org/author/XSAWYERX), Sawyer X est aussi l'auteur de [Dancer]( http://perldancer.org/)) sur les releases **x.y.0** (depuis 2017) et ensuite sur les numĂ©ros patch soit ça varie soit c'est **Steve Hay**. Avant **Sawyer X**, le pumpking Ă©tait **Ricardo Signes** ([profil CPAN](https://metacpan.org/author/RJBS)) sur les releases **x.y.0** (depuis 2013) et de nombreux autres sur les patchs. Voici la [liste des "pumpking"](https://perldoc.perl.org/perlhist.html#THE-KEEPERS-OF-THE-PUMPKIN) ainsi que l'[explication de la citrouille de patch](https://perldoc.perl.org/perlhist.html#PUMPKIN%3f). Les dĂ©veloppeurs du cƓur de perl se nomment les [Perl5 porters](https://lists.perl.org/list/perl5-porters.html), ils contribuent leur code dans le [repository git de Perl](https://perl5.git.perl.org/perl.git) et utilisent le [gestionnaire de ticket request tracker](https://rt.perl.org/Public/Search/Results.html?Query=Queue%20=%20%27perl5%27%20AND%20(Status%20=%20%27new%27%20OR%20Status%20=%20%27open%27%20OR%20Status%20=%20%27stalled%27)). Sawyer X vient d'annoncer sur la liste de diffusion de Perl 5 Porters la [dĂ©cision commune de migrer le git repo principal ainsi que le gestionnaire de tickets vers github](https://www.nntp.perl.org/group/perl.perl5.porters/2019/06/msg255335.html) (notez d'ailleurs que Python fait la meme chose [PEP581](https://www.python.org/dev/peps/pep-0581/) et [PEP588](https://www.python.org/dev/peps/pep-0588/)). A priori, le [repository github perl5 du projet Perl5](https://github.com/Perl/perl5) qui n'est actuellement un miroir devrait donc devenir le repository officiel et le gestionnaire de tickets central de Perl. --- --- --- # CHANGELOGS Place maintenant aux diffĂ©rents **CHANGELOG** ou **perldelta** qui n'ont pas Ă©tĂ© traitĂ©s sur LinuxFR. C'est (peut-ĂȘtre) long, trĂšs dĂ©taillĂ©, mais ça permet de dĂ©couvrir certaines features ou de se rendre compte un peu comment se passent les fixes. __Je conseille donc Ă  ceux qui ne sont pas intĂ©ressĂ©s par les dĂ©tails internes du langage de lire en diagonale tout ce qui suit !__ Perl 5 est un langage mature et les Ă©volutions et les bugs ne sont pas forcement tous trĂšs impressionnants (c'est plutĂŽt rassurant). Ce qui va suivre est trĂšs dĂ©taillĂ© et les dĂ©tails techniques pas forcĂ©ment appropriĂ©s pour un dĂ©butant Perl. Mais les items sont accompagnĂ©s le plus souvent possible d'explications des fonctions ou du contexte du fix, ce qui peut donner de l'intĂ©rĂȘt mĂȘme si on ne saisit pas bien le cĂŽtĂ© technique. Les analyses de changelog qui suivent sont exhaustives c'est Ă  dire que mis Ă  part certaines mises Ă  jour de modules embarquĂ©s (et donc des diffs pas faciles Ă  remonter) et certaines Ă©volutions propres Ă  des systĂšmes qui ne nous intĂ©ressent pas, tout a Ă©tĂ© traitĂ©. Avant de commencer encore un petit [xkcd](https://xkcd.com/519/) pour vous motiver pour la suite (Licence CC-BY-NC) : ![Messing with Perl](http://imgs.xkcd.com/comics/11th_grade.png) # Sortie de Perl 5.22 La version **5.22.0** a dĂ©jĂ  Ă©tĂ© traitĂ©e dans la [dĂ©pĂȘche sortie de perl 5.22.0](https://linuxfr.org/news/sortie-de-perl-5-22-0) on passe donc directement Ă  la version suivante qui est la *version patch 5.22.1*. ## 5.22.1 Un changement incompatible sur des fonctionnalitĂ©s rĂ©centes mais boguĂ©es autour des regex **boundaries** et ici les **\b{sb}** pour phrase **\b{wb}** pour un mot et **\b{lb}** pour un retour Ă  la ligne et leurs amis. Encore aujourd'hui, toutes ces regex ne sont toujours pas parfaites et font simplement du **best effort**. ### MAJ des modules #### POSIX::strerror POSIX::strerror qui accidentellement Ă©crasait ``$!``(code erreur ou message d'erreur) a Ă©tĂ© fixĂ©. Cela signifie que le oneliner ```perl perl -MPOSIX -e '$! = 123; strerror($!); print "[$!]\n";' ``` n'affichait plus rien alors qu'il doit afficher : ```perl perl -MPOSIX -e '$! = 123; strerror($!); print "[$!]\n";' [No medium found] ``` Il faut voir que _strerror_ est une fonction qui permet d'obtenir le libellĂ© Ă  partir d'un code d'erreur. Or en Perl, un ``print $!`` fait dĂ©jĂ  ce travail (conversion implicite vers une chaine). MĂȘme chose pour ``print "[$!]\n"``. Si on veut avoir le code il faudra faire quelque chose comme ```perl perl -MPOSIX -e '$! = 123; print 0+$!;' ``` Ou encore avec **sprintf** ```perl perl -MPOSIX -e '$! = 123; print sprintf "%d", $!;' ``` (**scalar** ne marchera pas dans ce cas-lĂ ) ### Compilation #### Grave problĂšme de -Accflags et les quotes Le flag de compilation **-Accflags** ne pouvait plus contenir de quotes (**TRES GRAVE**). C'est fixĂ© en **5.22.1** ! Ouf :) Ce flag (prĂ©cĂ©dĂ© de **-A** pour **Add**) est transmis jusqu'au compilateur et peut contenir des trucs comme par exemple si on donne ceci au **Configure** script : ``-Accflags='-DAPPLLIB_EXP=\"/usr/libperl\"'`` Ça permet de faire que Perl ajoute **/usr/libperl** dans le `@INC` Ă  l'exĂ©cution. ### Bugfixes #### Possessive quantifier Un autre problĂšme sur une feature expĂ©rimentale de regex, les **possessive quantifier**. PlutĂŽt que de parler de ce qui ne fonctionnait pas, on va dĂ©tailler un peu ce qu'est un possessive. Les regular expressions peuvent ĂȘtre **greedy** (dĂ©faut) ou **non-greedy** (quantifier ? juste aprĂšs expression Ă  matcher) ou mĂȘme **possessive**. Un exemple pour comparer greedy et non-greedy : - **GREEDY (gourmand)** : `perl -e 'print "1ăƒ‰ăƒ«\n" if "aabaab" =~ qr/((aab)+)/;'` qui nous donne `aabaab` (match le plus possible) - **NON-GREEDY ou LAZY** : `perl -e 'print "1ăƒ‰ăƒ«\n" if "aabaab" =~ qr/((aab)+?)/;'` qui nous donne `aab` (s'arrĂȘte aprĂšs avoir trouvĂ©) Le **possessive quantifier** (**++** aprĂšs expression ou **?>** avant expression) va quant Ă  lui faire plus qu'ĂȘtre **gourmand** car il empĂȘche Ă©galement le retour en arriĂšre (et empĂȘche donc de matcher le **a** du **ab** suivant. - `perl -e 'print "1ăƒ‰ăƒ«\n" if "aab" =~ qr/(a*ab)/;'` trouve bien `aab` - **POSSESSIVE (1)** : `perl -e 'print "1ăƒ‰ăƒ«\n" if "aab" =~ qr/(a++ab)/;'` ne trouve RIEN - **POSSESSIVE (2)** : `perl -e 'print "1ăƒ‰ăƒ«\n" if "aab" =~ qr/(?>a*ab)/;'` ne trouve RIEN La diffĂ©rence entre **possessive** et **greedy** est que **greedy** va chercher Ă  matcher le plus possible mais en backtracking va ensuite essayer de matcher plus petit pour *arranger* en vue de ce qui est demandĂ© aprĂšs. En **possessive** non, ça matche le plus possible et c'est tout. #### Warnings fatality Un fix sur les **warnings fatality** qui pouvaient entrainer un crash. Qu'est-ce qu'un **warnings fatality** ? Une sorte de **-Wall -Werror** en version [Mortal Kombat](https://fr.ign.com/mortal-kombat-11-ps4/44757/video/mortal-kombat-11-toutes-les-fatalities-que-lon-connait-en-4k-60fps) ? (dĂ©solĂ© je n’ai pas pu rĂ©sister). Et bien c'est Ă  peu prĂšs ça. Un exemple : ```perl perl -e 'use utf8; use warnings FATAL => 'all'; print "\x{255}\n"; while(1) {print "Je suis vivant\n"}' ``` Cette ligne n'affiche QUE le warning `Wide character in print at -e line 1.` et puis s'arrĂȘte. Mais sans rien : ```perl perl -e 'use utf8; print "\x{255}\n"; while(1) {print "Je suis vivant\n"}' ``` La ligne exĂ©cute bien la boucle infinie aprĂšs avoir affichĂ© le warning. #### Regex sets Plusieurs utilisations marginales d'une feature expĂ©rimentale de regex crashait a l'exĂ©cution. Il s'agit des [regex_sets](https://www.effectiveperlprogramming.com/2015/02/perl-v5-18-adds-character-class-set-operations/) ou [Extended Bracketed Character Classes](https://metacpan.org/pod/perlrecharclass#Extended-Bracketed-Character-Classes) qui permettent de faires des ranges de possibles avec des opĂ©ration ensemblistes comme par exemple : ```perl qr/(?[ [\w] - [a-zA-Z] ])/; # (un mot ne contenant pas les lettres a jusqu'Ă  z, ni A jusqu'Ă  Z). ``` Cette feature est **expĂ©rimentale** et semble l'ĂȘtre encore aujourd'hui et requiert donc une dĂ©claration `no warnings "experimental::regex_sets";` pour dĂ©sactiver le warning associĂ© Ă  son usage. Plusieurs bugs et plusieurs fixes sur ce genre d'expressions : ```perl (?[ () ]) (?[(\c]) (?[!!(\w]) ou encore (?[[0]+()+]) ``` #### Cas marginal avec %:: Un autre cas marginal qui pouvait faire crasher l'interprĂ©teur : ``perl -e '%::=(); J->${\"::"}'`` Explications : `%::` est un hash valide (mais dĂ©jĂ  on cherche les problĂšmes avec cette syntaxe tirĂ©e par les cheveux) mais `::` est aussi un sĂ©parateur de classe or il existe une classe implicite qui s'appelle **main** et qui rĂ©cupĂšre par exemple les variables qui ne sont pas dĂ©clarĂ©es par `my` ou `state`. Par exemple `perl -e '$var = "toto"; print $main::var;'` affiche `toto`. #### Autres - Plusieurs petits fixes sur des usages de regex qui doivent terminer en erreur. Comme le cas des **nested quantifiers**. Un **nested quantifier** c'est ce genre de choses `/ab{2}??c/`. Ou encore certaines **sĂ©quences** non terminĂ©es `/(?i/`. C'est tout simplement des regex fausses mais perl doit gĂ©rer correctement cette erreur. - Un mauvais usage de **BEGIN** faisait crasher perl, Ă  prĂ©sent `BEGIN { }` est simplement reportĂ© en erreur. - Un bugfix sur le parsing de la ligne de commande (**-Cnn** pour unicode). Il s'agit de choses comme ceci `perl -C3 -e 'print "\x{255}\n"'` (qui produira `ɕ`). Le **-Cnn** pour Perl signifie qu'il faut activer les fonctionnalitĂ©s Unicode et je cite *The -C command line option can specify that certain inputs to the program are Unicode* ([perlunicode](https://perldoc.perl.org/perlunicode.html)) - Des bugs dans le support des nombres flottants hexadĂ©cimaux lors des overflows (perte de bits en haut ou en bas. Également un bug au formatage avec `sprintf "%a", $var`. ## 5.22.2 Pas de changement incompatible. ### SĂ©curitĂ© #### File::Spec **[CVE-2015-8607]** Bugfix dans **File::Spec** qui avait une faille avec le _taint mode_ (protection de l'input) dans la fonction `canonpath()`. `canonpath` est une fonction du **core module** **File::Spec** (un *core module* est un module fourni avec la distribution perl standard, Ă  chaque version de Perl, les *core modules* sont mis Ă  jour et certains sont Ă©ventuellement ajoutĂ©s ou retirĂ©s selon leur qualitĂ© et leur utilitĂ©). C'est une fonction qui permet de rĂ©cupĂ©rer le path canonique Ă  partir d'une chaine et ce de maniĂšre portable. C'est une fonction de cleanup. Exemple : ```perl perl -e 'use File::Spec; print File::Spec->canonpath ("/toto/./././\./tata")' /toto/tata ``` C'est une fonction qui travaille sur les chaines mais ne va pas jusqu'Ă  regarder le file systĂšme. D'ailleurs dans l'exemple le path /toto/tata n'existe pas sur le systĂšme : ```perl ls /toto/tata ls: cannot access '/toto/tata': No such file or directory ``` `abs_path` ou son alias `realpath` par exemple ```bash perl -e 'use Cwd; print Cwd::abs_path("/tmp/./././toto/../toto/../../tmp/./toto/tata")' ``` retournera bien `/tmp/toto/tata`... Mais seulement si le fichier **/tmp/toto/tata** existe ! `abs_path` est d'ailleurs aussi capable de rĂ©soudre les liens : ```bash ln -s /tmp/toto/tata /tmp/toto/link && perl -e 'use Cwd; print Cwd::abs_path("/tmp/./././toto/../toto/../../tmp/./toto/link")' ``` donnera bien `/tmp/toto/tata`... Mais seulement si le fichier **/tmp/toto/tata** existe ! #### Mkstemp et umask Bugfix sur le **umask** de **mkstemp** : au lieu de donner la nĂ©gation Ă  appliquer Ă  **0666** pour obtenir un **umask** rĂ©sultant de **0600**, la valeur donnĂ©e Ă©tait la valeur ciblĂ©e. Une fois la **nĂ©gation** faite avec **0666**, la valeur rĂ©sultant Ă©tait **0066**, donnant beaucoup de droits *aux membres du groupe* et *aux autres* et peu au propriĂ©taire. Nouvelle valeur aprĂšs le fix : **0177**. #### Autres - Fix accĂšs mĂ©moire non initialisĂ© par la fonction **crypt**(). - **[CVE-2016-2381]** Un autre bugfix sur un problĂšme intĂ©ressant. La façon de remplir **%ENV** Ă  partir de environ[] ne donnait pas forcement les mĂȘme valeurs. La cause ? Perl Ă©crasait l'entrĂ©e dans %ENV avec la derniĂšre vue alors que getenv gardait la premiĂšre. Avec le fix, non seulement l'ordre est le mĂȘme mais en plus le mĂ©nage est fait dans environ[]. - **[CVE-2015-8608]** Bugfix sur les fonctions **VDir::MapPathA** et **VDir::MapPathW** qui permettaient une attaque DoS grĂące a une lettre de volume bidouillĂ©e. ### MAJ de modules - **File::Spec** et notamment la fonction `canonpath()` vue plus haut. ### Compilation - Configure script gĂšre **gcc 5**. - Fix **-DPERL_MEM_LOG** qui Ă©tait casse. Mais qu'est-ce que **PERL_MEM_LOG** ? Avec ce flag, on va faire en sorte de logger quand on fait de l'allocation mĂ©moire. A l'exĂ©cution, Perl ira lire la variable d'environnement. `$ENV{PERL_MEM_LOG}` pour connaitre le format et la destination des logs. Par dĂ©faut ça part sur la stderr. - D'autres fixes principalement sur la compilation sur du platform specific (**Darwin**, **ppc64el**, **Tru64**) ou sur **libnm** et **DTrace**. ### Correction de bogues #### Here-docs Plusieurs bugfixes sur les **here-doc**. Petit rappel sur les **HERE-DOCS** mĂȘme si on a la mĂȘme chose en shell : ```perl my $str = <<'end_message'; Hello here-doc indent END_MESSAGE print $str; ``` Et Ă  l'exĂ©cution : ```perl perl here.pl Hello here-doc indent ``` Les problĂšmes Ă©taient : - Un crash possible si perl trouve la fin d'un fichier sans trouver la fin d'un **HERE-DOC**. - Une possible libĂ©ration de mĂ©moire sur un problĂšme de parsing de **HERE-DOC** #### Pack et UTF8 Premier bugfix sur pack avec **UTF8**(voir **5.24.4** **[CVE-2018-6913]**). Profitons de l'occasion pour parler un peu de [pack](https://perldoc.perl.org/functions/pack.html) : `pack` et `unpack` sont de formidables outils dĂ©taillĂ©s sur la page [perlpacktut](https://perldoc.perl.org/perlpacktut.html). Ils sont utilisĂ©s dans 2 principaux groupes de cas : 1. Le **formatage de chaine** (et la lecture de chaine formatĂ©e). Par exemple pour lire/Ă©crire des champs dans un tableau texte de dimension fixe. 2. Le **traitement des donnĂ©es binaires** et la conversion dans de nombreux formats (comme le ferait `sprintf` mais en BEAUCOUP plus puissant) comme nombre flottant, entier, UTF8, hexadĂ©cimal etc... On peut facilement corriger un problĂšme d'endianness... Bref c'est des outils trĂšs gĂ©nĂ©riques qui peuvent travailler sur des chaines de bytes. #### Autres - Le **C99 hexadĂ©cimal floating point notation support** ajoute en **5.22.0** n'Ă©tait pas tout Ă  fait correct, corrigĂ©. - De nombreux fix de segfaults sur des **aborts provoquĂ©s**, des **meilleures explications** quand le code utilise le mauvais contexte, ou quand on compile un pattern avec des classes de caractĂšres non terminĂ©es. Bref principalement **des amĂ©liorations pour le code faux** :D - Perl utilise `semctl()`... si possible. - Fix d'une optimisation trop brutale de `uc`, `ul`, `ucfirst` et `lcfirst` (modification en place parfois). - Optimisation de la compilation de regex avec des caractĂšres spĂ©ciaux, en attendant mieux en **5.24.0** :) ## 5.24.0 ### AmĂ©liorations du cƓur de Perl #### Combo ordre et prĂ©cision dans printf et sprintf On peut maintenant mixer prĂ©cision et ordre des arguments de **printf** et **sprintf**. Exemple d'ordre des arguments ```perl printf '%2$d %1$d', 12, 34; ``` qui donne `34 12` (on affiche argument 2 puis argument 1). Exemple de prĂ©cision ```perl printf '<%.2f>', 1; ``` qui donne ``<1.00>``. On peut donc en 5.24.0 faire ce genre de chose ```perl sprintf '|%.*2$d|', 2, 3 ``` qui donne ``|002|`` soit l'argument choisi par **2$** avec la prĂ©cision dĂ©finie par 3 (l'autre argument). C'est quand mĂȘme une feature assez sympa :) #### Hashbang Avec la sortie rĂ©cente de [Perl 6](http://perl6.org/) (au moment de cette release, pas au moment oĂč cette dĂ©pĂȘche est publiĂ©e), il Ă©tait bien que l'interprĂ©teur perl redirige un script avec hashbang contenant **perl6** vers **perl 6** (ou son alias [Raku](https://medium.com/@virtuallysue/larry-wall-announces-alternative-name-raku-for-perl-6-cd0ccf6f649c) apres la rĂ©flexion sur le [besoin d'un alias pour Perl 6](https://rakudo.party/post/A-Request-to-Larry-Wall-to-Create-a-Language-Name-Alias-for-Perl-6)) tout comme il le fait quand il trouve un hashbang ne contenant pas la chaine **perl**. On verra en **5.24.1** que ce n'Ă©tait pas une bonne idĂ©e (en tout cas l'implĂ©mentation en **5.24.0**). Pour comprendre exactement de quoi on parle, il faut rentrer dans les dĂ©tails : Lorsque qu'on exĂ©cute un fichier sans prĂ©ciser comment l'exĂ©cuter (exemple `./monscript.pl`), c'est le hashbang qui est lu et qui sert Ă  choisir. Mais dans le cas oĂč on appelle l'interprĂ©teur Perl et qu'il ne se reconnait pas dans le hashbang, il **passe la main** Ă  un autre programme. Par exemple, le fichier `jesuispython.pl` contient ceci : ```perl #!/usr/bin/env python import os; print "Hello from Python"; print os.environ["SHELL"]; print os.environ["_"]; import time; while True: time.sleep(5) ``` Ça ressemble Ă  du Python, ça a l'odeur du python et bien c'est parce qu'en fait c'est bien du Python :) Et ce n'est PAS un fichier Perl valide, on peut d'ailleurs s'en assurer avec un petit coup de syntax check `perl -c jesuispython.pl` qui nous donne : ```python perl -c jesuispython.pl syntax error at jesuispython.pl line 6, near "environ[" syntax error at jesuispython.pl line 7, near "environ[" syntax error at jesuispython.pl line 8, near "environ[" jesuispython.pl had compilation errors. ``` En lançant le fichier avec perl, tout se passe bien, car l'interprĂ©teur est intelligent et donne le script Ă  Python : ```perl perl jesuispython.pl Hello from Python /usr/bin/zsh /usr/bin/perl ``` Et si on vĂ©rifie bien qui fait vraiment tourner ce script : ```perl perl jesuispython.pl &; ps aux | grep "jesuispytho[n]" [1] 15745 61531 15745 0.0 0.0 18468 3608 pts/64 R 13:39 0:00 python jesuispython.pl Hello from Python /usr/bin/zsh /usr/bin/perl ``` (penser Ă  faire le mĂ©nage avec kill) Si on pousse un peu plus loin, on n'obtient pas le mĂȘme comportement cĂŽtĂ© Python. Si dans un fichier `jesuisperl.py` on met ceci (Ă  peu prĂšs la mĂȘme chose qu'en Python) : ```perl #!/usr/bin/env perl my $a = "Hello from Perl"; print "$a\n"; print "$SHELL\n"; print "$_\n"; while (1) { sleep 5; } ``` On a un fichier Perl valide mais Python ne passe pas la main et Python nous retourne simplement : ```perl python jesuisperl.py File "jesuisperl.py", line 3 my $a = "Hello from Perl"; ^ SyntaxError: invalid syntax ``` #### Post‐dĂ©rĂ©fĂ©rencement **Post‐dĂ©rĂ©fĂ©rencement** n’est plus expĂ©rimental. **Post‐dĂ©rĂ©fĂ©rencement** c’est ce genre de chose : ```perl my @new = $old->@*; ``` La forme plus classique pour obtenir le mĂȘme rĂ©sultat est ```perl my @new = @$old; ``` ou encore ```perl my @new = @{ $old }; ``` (notation **circumfix**) #### Autre - Support [unicode 8](https://www.unicode.org/versions/Unicode8.0.0/) (unicode 8 ajoute des milliers de nouveaux symboles). - L'interprĂ©teur rĂąle (exception) si on ne peut pas fermer un fichier Ă©ditĂ© en place. - Nouveau **\b{lb}** dans les regex. **\b{}** est pour boundaries et **lb** pour linebreak. - [Extended bracketed character classes](https://metacpan.org/pod/perlrecharclass#Extended-Bracketed-Character-Classes) (dĂ©jĂ  parlĂ© plus haut dans la dĂ©pĂȘche dans bugfix 5.22) est Ă  prĂ©sent compatible avec **UTF-8**. - Comportement des shifts (**>>** et **<<**) des entiers mieux dĂ©finis, quelle que soit l'implĂ©mentation C dessous. - AmĂ©lioration de **sigaction** qui sert Ă  donner une fonction Ă  exĂ©cuter lors d'un signal. L'amĂ©lioration consiste (quand c'est possible, donc que le systĂšme le gĂšre) Ă  ajouter un hash contenant des infos sur le processus. ### SĂ©curitĂ© - Fix **umask** donnĂ© Ă  **mkstemp** (dĂ©jĂ  vu plus haut en **5.22.2**). - **[CVE-2015-8608]** Bugfix sur les fonctions VDir::MapPathA et VDir::MapPathW (dĂ©jĂ  vu plus haut en **5.22.2**). - **[CVE-2015-8607]** Bugfix dans File::Spec (dĂ©jĂ  vu plus haut en **5.22.2**) - Fix accĂšs mĂ©moire non initialisĂ©e par la fonction **crypt()** (dĂ©jĂ  vu plus haut en **5.22.2**). - **[CVE-2016-2381]** Fix sur environ (dĂ©jĂ  vu plus haut en **5.22.2**). ### Changements incompatibles - La version **5.24.0** interdit la feature expĂ©rimentale autoderef c'est Ă  dire qu'on ne peut plus faire `perl -e 'use experimental 'autoderef'; my $a = []; push $a, "a"'` (il faut faire `push @a, "a"`). Ça interdit donc le **push to ref** et on peut suivre sur perlbanjo [la vie et la mort de autoderef](https://perlbanjo.com/ee4c91c30e). - Suppression de la variable lexicale **$_**. C'est apparu en **5.10** puis passĂ© en expĂ©rimental en **5.18**. En gros on laisse perl gĂ©rer cette variable spĂ©ciale (globale). - Le **boundary** word blank ne suit plus scrupuleusement les rĂšgles Unicode mais fait plus ce qu'attend perl (et ressemble a **\b** tout seul mais en mieux). Respecter scrupuleusement Unicode ne semble pas ĂȘtre le mieux adaptĂ© pour dĂ©tecter les frontiĂšres de mots. On parle de cas marginaux comme des espaces puis un tilde puis un espace vertical...Ça reste du best effort tout de mĂȘme. [Plus de dĂ©tails](https://metacpan.org/pod/perlrebackslash#%5Cb%7Bwb%7D). - Certaines regex qui Ă©taient en erreur au runtime ne compilent plus du tout. Ici il s'agit d'**unicode properties** ([wikipedia](https://en.wikipedia.org/wiki/Unicode_character_property) dans les `\p{}` et `\P{}` ([perluniprops](https://perldoc.perl.org/perluniprops.html#Properties-accessible-through-%5cp%7b%7d-and-%5cP%7b%7d)). Ce genre de dĂ©placement des erreurs est bon, car le code "casse" 100% du temps alors qu'il cassait qu'en atteignant la regex fautive avant. - Une expression **unicode name** vide comme ceci `\N{}` (qui ne sert Ă  rien) devient fatale quand on active `use re "strict"`. - Les dĂ©clarations imbriquĂ©es deviennent interdites `my($toto, my($tata))`. Au passage, `my $toto` n'est pas toujours pareil que `my ($toto)` (lors d'une affectation). Et mĂȘme sans affectation `my($toto, $tata)` n'est pas `my $toto, $tata;` ! - La classe de caractĂšre **\C** n'existe plus du tout (erreur de compilation). DĂ©prĂ©ciĂ© depuis 5.20, warning depuis 5.22. - La fonction **chdir** ne peut plus s'utiliser comme ceci `chdir('')` ou `chdir(undef)` pour aller dans $HOME. Mais `chdir()` fera tout simplement l'affaire. - Plus de caractĂšres invisibles dans les noms de variables. MĂȘme ceux de la table ASCII ! - Fix une config de [Carp](https://perldoc.perl.org/Carp.html) - Seuls **\t** et un **espace** sont autorisĂ©s dans les **Extended Bracketed Character Classes**. Il n'y a Ă©videmment pas que ça dans les **Extended Bracketed Character Classes** mais tab et space sont ignorĂ©s :) ### DĂ©prĂ©ciations - Limitation Unicode code points. Jusqu'alors Perl autorisait les valeurs unicodes qui sont au delĂ  du maximum unicode existant (donc qui ne correspondaient Ă  aucun caractere...). Ça posait problĂšme dans certaines transformations ou comparaisons. La valeur du code est Ă  prĂ©sent limitĂ©e. - L'opĂ©rateur de **bitwise** associĂ© Ă  une chaine travaille sur des bytes, travailler sur des choses plus grandes (des caractĂšres encodes sur plus d'un byte) nĂ©cessite un dĂ©coupage. Donc il y aura un warning Ă  ce sujet. - **sysread()**, **syswrite()**, **recv()** et **send()** Ă©mettent un warning si on les utilise avec un filehandle marquĂ© **:utf8** ### Performances - Moins d'overhead sur les changements de contexte. - Lorsqu'une langue est insensible Ă  la casse, en le sachant avant, on peut optimiser les fonctions comme **ucfirst** ou les regex avec modifier **/i** - La recherche de chaines fixe dans une regex peut ĂȘtre plus rapide (majoritĂ© des cas) ou parfois plus lente. - Les calculs arithmĂ©tiques sont plus rapides (le support du **64-bits** avait mis un coup de frein). - **Pre/Post Increment/Decrement** ont Ă©tĂ© optimisĂ©s (grĂące Ă  de la modularisation de code en fonctions). - **Optimisation debugger**, moins de structures de donnĂ©es créées car inutiles. - Les assignements d'un seul argument dans une liste comme `($v) = ("toto");` et `($new) = ($old);` sont plus rapides. - **Pic de mĂ©moire rĂ©duit** Ă  la compilation de regex. Une **compilation de regex** se fait en utilisant [qr//](https://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators) (en fait perl dĂ©cide ou non de compiler) ### Compilation - **Option -O** donnĂ©e par dĂ©faut Ă  **Configure**. - Plus de support de **libnm**. - Configure : test **newlocale**, **freelocale** et **uselocale**. - Support **Bison 3.0**. - On peut changer la date affichĂ©e par le binaire perl (**perl -V**) en modifiant la variable **PERL_BUILD_DATE**. - IncompatibilitĂ© entre **NO_HASH_SEED** et **PERL_HASH_FUNC_ONE_AT_A_TIME_HARD** (algo par dĂ©faut). - Configure : meilleure gestion des espaces dans les chemins (path). - Plus de gĂ©nĂ©ration des tables **EBCDIC POSIX-BC**. [EBCDIC](https://fr.wikipedia.org/wiki/Extended_Binary_Coded_Decimal_Interchange_Code) signifie "**Extended Binary Coded Decimal Interchange Code**" et il s'agit d'un codage de caractĂšre qui existe sur les mainframes. - Support du build en parallĂšle pour Windows **GNU Make**. - Support de **MSVC++** sur Windows avec **GNU Make**. - **miniperl** a `getcwd`. **miniperl** est une mini version de perl utilisĂ©e pour se construire lui-mĂȘme. En prenant les sources on va compiler d'abord **miniperl** qui va aider ensuite Ă  compiler **perl**. - Configure prend en compte **-Dusequadmath** pour calculer **alignbytes**. On verra plus tard (5.24.3) que **-Dusequadmath** est incompatible avec **-Duselongdouble**. - Un test de compilation en parallĂšle est ajoutĂ© dans le makefile pour Windows. - Support d'**AmigaOS** rĂ©intĂšgrĂ© dans le build. - Utilise **fdclose()** fonction de **FreeBSD** si disponible. - Shared libperl compile sur toutes les variantes **Solaris**. - Sur **VMS**, Perl implĂ©mente son propre **killpg**. - D'autres choses sur **MacOS**, **Tru64**, **IRIX**, **EBCDIC**, **cygwin**, **Win32** et **ppc64el**. ### Changement internes - Refactorisation du code de **context stack system** et ses API. Macros remplacĂ©es par static inline fonctions. Changement de naming (**cx_** ou **CX_** prĂ©fixe). - Une structure Ă©crite pour **Perl 1** a Ă©tĂ© supprimĂ©e (**PL_timesbuf**). Bravo a **PL_timesbuf** pour sa longĂ©vitĂ© :) - Emulation de **signbit()** amĂ©liorĂ©e. **signbit()** est une fonction pour connaitre le signe d'une valeur passĂ©e en paramĂštre. ### Bugfixes - Si vous vous souvenez des [perluniprops](https://perldoc.perl.org/perluniprops.html#Properties-accessible-through-%5cp%7b%7d-and-%5cP%7b%7d) eh bien ici ça va plus loin car on parle de mettre des propriĂ©tĂ©s **utilisateur** et **non-dĂ©finies** au moment de la compilation de la regex comme ceci `qr/\p{sheldon::bazinga}/i`. Ça ne marchait pas et c'est fixe en 5.24.0. - Il existe des versions "fallback" de fonctions comme **memcpy()**, **memset()** **memmove()** et **memcmp()** mais elle sont pas tout Ă  fait comme les originales. D’ailleurs comme le dit **bulk88** sur le [tracker](https://rt.perl.org/Public/Bug/Display.html?id=127619#txn-1390267) *We aren't eating out own dog food* car Perl est compilĂ© avec les version originales. Ça ne prouve pas que les fallback sont cassĂ©s, mais ça ne prouve pas le contraire non plus :) C'est fixĂ© en **5.24.0** - ProblĂšme avec la substitution et le [modifier](https://perldoc.perl.org/perlre.html#Modifiers) **/r** (substitution non destructrice et retourne la nouvelle valeur) donc ce genre de chose `s///r`. Le problĂšme vient quand on compile perl avec **-DPERL_NO_COW**. Attention cette variable ne dit pas que perl ne doit pas contenir de [vaches](https://fr.wikipedia.org/wiki/Cowsay) mais interdit la [Copy On Write](https://fr.wikipedia.org/wiki/Copy-on-write) :) - Meilleur reporting avec **strict** - Meilleur report d'erreur sur les regex. Des messages Ă  la place de simplement "Assertion failed", des erreurs gĂ©nĂ©rĂ©es sur des classes de caractĂšres non terminĂ©es - Il y avait une petit range de valeur oĂč la fonction **caller** donnait des numĂ©ros de lignes nĂ©gatifs, c'est fixĂ©. - Un warning sur **unless( $v = "abc")** par exemple `perl -e 'use warnings; unless(my $v = "toto") { print "a"; }'` donne `Found = in conditional, should be == at -e line 1.` si warnings est activĂ©. - Un cas trĂšs marginal de here-doc non terminĂ© (`map d<<<<`) ne gĂ©nĂšre pas de assert failed ou de crash mais bien une erreur. - ProblĂšme avec **tie** et **untie**. Ces fonctions servent Ă  faire de l'orientĂ© objet. - Bugfix sur la directive **#line** sans **fichier** donc un truc comme `#line 0000000` - Un warning sur les regex et les [classes POSIX](https://metacpan.org/pod/distribution/perl/pod/perlrecharclass.pod#POSIX-Character-Classes) `[[:alpha:]]` lorsqu'elles sont mal Ă©crites comme `[[:alpha]]`. Ca ressemble Ă  une classe POSIX, c'est presque une classe POSIX mais ce n’est pas une classe POSIX. Donc perl prĂ©fĂšre prĂ©venir. - RĂ©gression en 5.20 sur les classes et les synthetic start class. Un code qui bug est comme ceci `/_?[^\W_0-9]/` - AmĂ©lioration du **support C99 notation hexa a virgule flottante** ajoutĂ© en **5.22** - MalgrĂ© l'activation du mode strict, ce genre de code `use strict; my %h = (); my $v = $h{+toto};` n'Ă©mettait pas d'erreur. - Un bug sur ce genre d'expressions : ```perl &{0==&{0==0}}.0 &{0==0}/&{0==0}&0 &{0*&{0==0}==0}/0 &{0==0}*&{0==0} # Appels imbriquĂ©s (ou pas) avec **&**. L’étoile est un **typeglob** (le bug n'est pas liĂ© Ă  ça). ``` - Meilleur rapport d'erreur quand perl attend un opĂ©rateur et trouve un tableau. - Bugfix sur les regex. Le bug apparaissait en mĂ©langeant **\G** et chaines utf8. l'expression **\G** permet de matcher seulement Ă  la position (on la set avant grĂące a **pos()** - Bugfix sur le **parsing de here-docs bizarres** - Fixe un bug liĂ© aux **variables spĂ©ciales** **$a** et **$b** dans des cas comme `@a = sort{ *a=0; 1} 0..1;` - Plusieurs problĂšmes sur le rĂ©cent format **%a** - AmĂ©lioration du **boundary** espace **\b{sb}**. Les tests sur 5.22.0 Ă©taient faits sur des chaines trop petites, en ajoutant de nombreux tests sur des chaines plus longues, on s'est aperçu que cette expression n'Ă©tait pas parfaite. - De nombreux bugs sur les boundaries en gĂ©nĂ©ral `\b{gcb}`, `\b{sb}`, `\b{wb}`, `\B{gcb}`, `\B{sb}`, et `\B{wb}`. - De NOMBREUX bugs sur [Extended Bracketed Character Classes](https://metacpan.org/pod/distribution/perl/pod/perlrecharclass.pod#Extended-Bracketed-Character-Classes). Il s'agit de bug sur des expressions incomplĂštes (incorrectes donc) mais au lieu de faire une erreur perl panique. Par exemple sur `(?[\ &!])`, `(?[!()])`, `(?[(\c]) ` ou `?[ () ]` - Les quantifiers imbriquĂ©s (regex) doivent produire une erreur, et non ĂȘtre ignorĂ©s. - Le parsing des nombres hexadĂ©cimaux Ă  virgule flottante a Ă©tĂ© amĂ©liorĂ©. - Bugfix sur `pack 'H'` ou `pack 'h'` (chaine hexa). On a dĂ©jĂ  vu ce genre de problĂšme (**5.22.2**) et c'est toujours pareil, de l'**UTF8**, une fin prĂ©maturĂ©e et une fonction pack qui lit trop de bytes. - Plusieurs fixes de segfault. - Les commentaires dans les regex (`(?#...)`) n'Ă©taient pas possibles partout. La question s'est posĂ©e de savoir si c'Ă©tait **by design** ou si c'Ă©tait un bug. Finalement je crois que la solution est entre les 2 (maj de doc + fix) - La tentative de crĂ©ation d'une stack Ă©norme avec par exemple `@a = (1) x $big_number` (attention [x](https://perldoc.perl.org/perlop.html#Multiplicative-Operators) est l'**operateur de rĂ©pĂ©tition** qui fait rĂ©pĂ©ter une chaine) faisait crasher perl. Apres le fix ça fait une exception :) - Bugfix dans les expressions conditionnelles dans les regex (`(?(condition)si-oui|si-non)`) avec `?!` qui ne donnait pas le bon comportement. Le code `print /(?(?!)(?{print "Yes"})|(?{print "No"}))/` doit donner `No` et il donnait rien du tout. - Les [backtracking control verbs](https://perldoc.perl.org/perlre.html#Special-Backtracking-Control-Verbs) prennent tous potentiellement des arguments. - **dup** un filehandle fermĂ© ne crĂ©e plus de fichier poubelle. - Warnings fatal ignore en rembobinant la stack pour Ă©viter la rĂ©cursion infinie. Car un fatal fait rembobiner la stack et si on voit un fatal on rembobine etc... - Bugfix sur l'option perl **-Cnn** (qui active unicode). Ca a Ă©tĂ© touchĂ© en 5.22 - Si on passe une valeur nĂ©gative Ă  votre `alarm()` ou `sleep()`, avant, la valeur Ă©tait transmise Ă  la fonction C, avec un rĂ©sultat potentiellement surprenant. Maintenant on a un warning et ça retourne **undef** - Les grandes valeurs de caractĂšre bien aprĂšs Unicode dans les regex ne crashent plus. - Gestion des limites en utilisant l'opĂ©rateur **range** par exemple `1...888888888888888` (il faut que ça dĂ©passe l'espace d'adressage) - Transformations avec ce genre de chose `tr/\x{101}-\x{100}//` Ă©tait mal gĂ©rĂ©es. ## 5.24.1 Pas de changements incompatibles. ### SĂ©curitĂ© Tout d'abord, il ne faut pas avoir peur des CVE, la majoritĂ© du temps c'est les dĂ©veloppeurs Perl eux-mĂȘmes qui demandent Ă  crĂ©er l'identifiant CVE. Mais bon, bonne nouvelle quand mĂȘme, il n'y en a pas dans la **5.24.1** :) - Bugfix d'un problĂšme d'output de **PerlIO** qui n'attendait pas de lire les switchs (flags de Perl dans le hashbang ou la ligne de commande) et pouvait crĂ©er un fichier mĂȘme lorsque le switch -T ou -t n'Ă©tait pas d'accord. - Les **core modules ne cherchent plus dans "." pour les modules optionnels**. C'est quelque chose d'important car mĂȘme si en gĂ©nĂ©ral le rĂ©pertoire courant est le dernier dans **@INC**, ça pouvait permettre de faire exĂ©cuter des morceaux de code en posant un module dans un rĂ©pertoire oĂč va ĂȘtre lancĂ© un script Perl par un autre utilisateur. On peut regarder le contenu de `@INC` de cette maniĂšre par exemple ```bash perl -e 'print join "\n", @INC' ``` ou mĂȘme ```perl perl -e 'foreach my $i (@INC) { print "[$i]\n"; }' ``` qui va sortir quelque chose comme ça : ```perl [/tools/production/lib/perl5/] [/tools/local/current/lib] ... ... [/usr/lib/perl5/vendor_perl] [.] # (on note bien que "." a Ă©tĂ© ajoute par Perl Ă  @INC) ``` Quand on dit que les modules ne cherchent plus dans ".", en fait il ne s'agit pas de tous les core modules, un core module _rĂ©siste encore et toujours Ă  l'envahisseur_... Non plus sĂ©rieusement le travail sur le module **base** n'a pas pu ĂȘtre fait et est attendu pour la version patch **5.24.2**. **base.pm** est un module qui sert pour la programmation objet pour dĂ©finir la classe *parente*. ### Bugfixes - L'implĂ©mentation naĂŻve en **5.24.0** de la redirection de l'interprĂ©teur vers perl6 est incorrecte. Il s'agissait de rediriger si on trouve perl6 dans le hashbang, mais ça posait problĂšme pour le cas par exemple d'une install de perl Ă  l'endroit **/opt/perl64/perl** ### MAJ de modules - Fix de sĂ©curitĂ© sur **XSLoader** (chargement de fichier binaires hors de @INC) dĂ©tails [ici](https://perl5.git.perl.org/perl.git/commit/7099cb3d4b19649244b3ff4171da683abbd5e2bd) ## 5.24.2 ### SĂ©curitĂ© - Cette fois le travail pour arrĂȘter de charger les modules optionnels Ă  partir de "." a Ă©tĂ© fait pour **base.pm** - Un autre bugfix sĂ©curitĂ© sur la PATH. En Perl le mode taint considĂšre que tous les path relatifs sont taintĂ©s, mais on pouvait jusqu'alors protĂ©ger un sĂ©parateur avec un antislash. Donc `PATH=/tmp/toto\:./repertoire/dangereux/` Ă©tait vu par Perl comme **/tmp/toto/repertoire/dangereux/** donc **safe** mais l'OS n'est pas forcement d'accord avec cet Ă©chappement et donc continue Ă  avoir le **/tmp/toto/:./repertoire/dangereux/** dans son PATH. C'est corrige. ### Bugfixes - Un bug concernant `s///l` (substitution avec jeu de caractĂšre local) lorsqu'on essaye d'un autre cĂŽtĂ© de forcer une substitution sur un jeu de caractĂšre qui ne correspond justement pas bien au locale par exemple un code comme `my $v='ɕ'; $v =~ s/0*(\w)//l` doit casser. ## 5.24.3 ### SĂ©curitĂ© - **[CVE-2017-12837]** Bugfix d'un possible heap overflow avec le case insensitive modifier (**/i**) qui permet de faire des regex qui match sans se soucier de la casse et les caractĂšres unicodes nommes **\N{MON NOM UNICODE}**. En parlant de casse et d'unicode, ce n’est pas Ă©vident le passage en majuscule ou en minuscule d'un caractĂšre. Par exemple `áșž` en minuscules c'est `ß` ou `ss` ? - **[CVE-2017-12883]** Bugfix d'un over read dans les regex avec quelque chose comme ça `m'\N{U+.}';`. Le comportement du bug dĂ©pendait de la version de perl ou de la plateforme mais en gĂ©nĂ©ral produisait une lecture et un report (message d'erreur) de donnĂ©es potentiellement sensibles ou simplement un crash. - **[CVE-2017-12814]** Un bugfix sur un possible stack buffer overflow. La chaine Ă©tant bien prĂ©parĂ©e, le mĂ©canisme de buffer pour la copie est obsolĂšte et le buffer est supprimĂ©. Plus de buffer plus de problĂšme. - **[Pas de CVE id]** Grosse vulnĂ©rabilitĂ© dans **sprintf**. On peut produire un buffer overflow en faisant quelque chose comme ceci `print sprintf("%2000.2000f this is a spacer %4000.4294967245a", 1, 0x0.00008234p+9);`. On Ă©largie le buffer puis on donne une valeur qui va faire overflow. ### Bugfixes Beaucoup de bugfixes pour une version patch mais c'est du Ă  de nombreux reports issues du [fuzzing](https://fr.wikipedia.org/wiki/Fuzzing). Ici l'outil utilise est [American Fuzzy Lop](https://en.wikipedia.org/wiki/American_fuzzy_lop_(fuzzer)) par l'intermĂ©diaire de la commande `afl-fuzz` et les cas en doubles sont ensuite rĂ©duits grĂące a `afl-tmin` (qui fait partie de la suite American Fuzzy Lop) #### Vieux bug de double nĂ©gation Un trĂšs vieux bug sur les expressions logiques avec **&&** et **||**. Par exemple sur ce genre d'expression ``!r || !n'`` En fait, **2 optimisations par le compilateur interfĂšrent** et produisent ce bug : perl commence par optimiser la double nĂ©gation en une seule nĂ©gation devant une parenthĂšse et remplacer le **||** (ou **or**) par un **&&** (ou **and**). Or il commence par enlever les nĂ©gations et remplacer l'opĂ©rateur logique **or** et il se marque sur un petit papier de cĂŽtĂ© pour plus tard de "penser Ă  mettre **!()** autour de mon expression". D'aprĂšs la table de vĂ©ritĂ©, c'est tout Ă  fait juste et permet d'optimiser Ă  une seule nĂ©gation : |r |n |!r |!n |!r or !n |r and n |!(r and n)| |------|------|------|------|-----------|----------|----------| |0 |0 |1 |1 |1 |0 |1| |0 |1 |1 |0 |1 |0 |1| |1 |0 |0 |1 |1 |0 |1| |1 |1 |0 |0 |0 |1 |0| Mais voilĂ , lorsqu'il s'agit de constantes, perl prend un raccourci et le petit papier est perdu et ça termine en un ``r or n``. Ce qui n'est pas du tout pareil. Ça reste un cas trĂšs marginal (Ă  cause des constantes) mais c'Ă©tait un gros bug ! #### perl -x Avec le switch -x, les numĂ©ros de lignes sont faux. Le switch perl **-x** sert Ă  exĂ©cuter du code mĂ©langĂ© dans un texte. Imaginons un fichier texte **mail.txt** : ``` Salut DLFP, J'espĂšre que la dĂ©pĂȘche vous plait :) Bisous #!/usr/bin/env perl print "Bazinga\n"; __END__ Tout ceci est CC-BY-SA ``` Avec un `perl mail.txt` j'ai une erreur mais avec `perl -x mail.txt` j'ai bien mon `Bazinga` :) #### Autre - Un bugfix pour Ă©viter les scripts bizarres comme `/@0{0*->@/*0` de crasher. - Un bugfix sur le mot clĂ© **reset** (Ă  mon avis assez peu utilisĂ©). **reset** permet de reset une variable Ă  sa valeur initiale, mais seulement les variables globales, ou de rĂ©activer un pattern de maching Ă  usage unique dans une boucle. - Fix crash sur du code marginal comme `/${*::::::=0}0ăƒ‰ăƒ«{*::::=0}/` - Un bug sur le **bitwise AND assign** operator **&=** mis en lumiĂšre par ce genre de code `use feature':all';@0&=0`. Le problĂšme vient de ce qui est Ă  gauche du bitwise (un tableau) mais le code est faux mais ne doit pas crasher. - Fix error code retourne par **socket** (passe le code d'erreur du systĂšme) - Fix memory leak lorsqu'on importe et utilise le mode strict pour contrĂŽler une regex. `use re qw(strict)` permet d'avoir des warnings lorsqu'une regex commence Ă  ĂȘtre **ambiguĂ«**. Par exemple `qr/\xABAB/` est plus ou moins ambigu et le strict regex va gĂ©nĂ©rer une erreur pour forcer le dĂ©veloppeur Ă  prĂ©ciser sa pensĂ©e (avec des accolades). - Un autre bugfix sur du code trĂšs bizarre `open my $fh, ">", \ (my $buf = ""); my $sub = eval q|sub {die}|; $sub->()`. Dans ce genre de cas trĂšs prĂ©cis ou **$fh** et **sub** sont dĂ©clarĂ©s dans cet ordre et sont des variables lexicales, la fermeture implicite de **$fh** entraine la libĂ©ration mĂ©moire de **$sub**. - Des problĂšmes de parsing de regex sur les [extended patterns](https://perldoc.perl.org/perlre.html#Extended-Patterns) comme `/(?<=/` ou `/(?` est plus rapide (code qui teste le retour Ă  la ligne a Ă©tĂ© optimisĂ©) - On utilise le [COW](https://fr.wikipedia.org/wiki/Copy-on-write) plus souvent - Conversion chaine mono digit plus rapide. - À partir de **5.26.0** on applique le [constant folding](https://fr.wikipedia.org/wiki/Constant_folding) Ă©galement pour les chaines. Donc `my $s = "a" . "b";` est compilĂ© comme `my $s = "ab";` ### Changement internes - **Time::HiRes** module (timers trĂšs prĂ©cis) est compilĂ© avec **C++11** - Nouveau message d'erreur **Version control conflict marker** si perl dĂ©tecte un marqueur de **VCS** comme un conflit **git**. - De nombreuses nouvelles fonctions pour gĂ©rer **UTF8** - Perl compile par dĂ©faut avec **PERL_OP_PARENT** qui permet Ă  un opĂ©rateur de connaitre son parent - Des nouveaux opĂ©rateurs pour gĂ©rer les signatures de fonctions. - Une fonction **op_class()** pour connaitre la classe d'un opĂ©rateur - Sortie en ASCII art de **op_dump()** - Meilleur mode debug ### Compilation - On en a parlĂ© longuement dĂ©jĂ , nouvelle option **-Ddefault_inc_excludes_dot** pour ne plus ajouter **.** au **@INC** Ă  l'exĂ©cution. - On peut dĂ©sactiver [PERL_HASH_SEED](https://metacpan.org/pod/distribution/perl/pod/perlrun.pod#PERL_HASH_SEED) et [PERL_PERTURB_KEYS](https://metacpan.org/pod/distribution/perl/pod/perlrun.pod#PERL_PERTURB_KEYS). DĂ©sactiver c'est mettre le comportement de base tout simplement. Si on donne une valeur Ă  **PERL_HASH_SEED** alors on force la graine pour le cĂŽtĂ© alĂ©atoire du parcours de hash. C'est potentiellement une mauvaise idĂ©e... et ça va forcer **PERL_PERTURB_KEYS** (si pas dĂ©fini) : - **PERL_PERTURB_KEYS = 0** alors traverser un hash se fait toujours de la mĂȘme maniĂšre, mĂȘme lors d'une seconde exĂ©cution de programme - **PERL_PERTURB_KEYS = 1** alors traverser est totalement alĂ©atoire - **PERL_PERTURB_KEYS = 2** alors l'ordre des clĂ©s change Ă  l'insertion mais de maniĂšre reproductible entre les exĂ©cutions de programme Cela se fait Ă  l'aide de cette variable configure **-Accflags=NO_PERL_HASH_ENV.** Pareil pour **PERL_HASH_SEED_DEBUG** qu'on pourra dĂ©sactiver avec **-Accflags=-DNO_PERL_HASH_SEED_DEBUG** - Fin du support de nombreux algos de hash non recommandĂ©s. - Plus de warning **Warning: perl appears in your path** car Perl est quasi toujours dans le path :) Des amĂ©liorations au niveau du padding : - Mise Ă  zĂ©ro pour l'alignement. - Format de sortie change pour **perl -V** - Fixes sur **clang**, **gcc 6** **flto** et cross-compilation - **PATH** sĂ©parateur sur **VMS** devient **:** lorsque le shell est un shell Unix - Fin du support du format **a.out**. Je cite *Linux has used ELF for over twenty years.* :) - Toujours pas de support pour **pid**, **gid**, **uid** avec **SA_SIGINFO** sur **OpenBSD 6** - Un test qui ne finit pas est dĂ©sactivĂ© sur **FreeBSD** - Support de `setproctitle()` sur **DragonFly BSD** - Pas de support des nombres flottants infinis sur **NetBSD**. 98% des test sont bons. - D'autres trucs sur **VAX**, **Hurd**, **HP-UX**, **EBCDIC**, **Darwin** ### Bugfixes #### Parsing %:: Un bugfix sur un mauvais parsing de code comme `use re %:=0`. **%:** n'est rien mais **%::** est le main stash (Ă©quivalent de **%main::**). Si on dĂ©clare une variable sans **my** elle s'attache au **main stash** et on peut lister le contenu du main stash comme un autre hash : ```perl perl -e 'my $toto = "a"; $tata = "b"; foreach my $k (keys %::) { print "$k\n"}' | grep "tata\|toto" tata # NB : toto n'est pas dans le main stash et un `foreach` sur `%:` ne fait rien du tout. ``` Ou accĂ©der Ă  la variable comme ceci : ```perl perl -e '$tata = "b"; print "$main::tata\n"' b ``` #### Parsing de $foo::$bar Le parsing de `"$foo::$bar"` a changĂ© en **5.18**. Le parsing "normal" consiste Ă  traiter ça comme ``$foo:: . $bar``, donc ```perl my $foo = "abc"; my $bar = "def"; print "$foo::$bar" ``` produit ``def``. Mais avec le changement de parsing ``$foo."::".$bar``, ça donnait ``abc::def``. Les perl porters n'Ă©taient pas sĂ»rs du bon comportement, mais partant du principe de rester cohĂ©rent avec `$foo::%bar` ils ont remis l'ancien parsing. #### Regex recursion infinie Dans certains cas, l'exĂ©cution de [code embarquĂ© dans une regex](https://perldoc.perl.org/perlre.html#Embedded-Code-Execution-Frequency) pouvait aboutir Ă  une rĂ©cursion infinie de la stack C (pas la mĂȘme que la stack Perl). Un exemple de code est celui-ci `/(?{ s!!! })/`. Il faut que le pattern qui match soit lui-mĂȘme. Lorsque rien n'est spĂ©cifiĂ© c'est `$_` qui est matchĂ© : ```perl $_ = "toto"; print "Get it\n" if /to/; ``` nous donne donc `Get it`. ```bash perl -le '/(?{ m##, s|||})/' Segmentation fault (core dumped) ``` Pas besoin de prĂ©ciser le premier **m** car le slash suffit mais le second **m** est obligatoire. Au niveau fonctionnel ce code est un non-sens en tout cas. #### LHS RHS Changement de comportement dans le cas d'assignement avec **RHS** n’ayant pas assez d'Ă©lĂ©ments par rapport au nombre d'Ă©lĂ©ments **LHS**. **LHS** et **RHS** signifient **Ă  gauche du Ă©gal** et **Ă  droite du egal** (cf [LHS/RHS](https://en.wikipedia.org/wiki/Sides_of_an_equation)). Dans le cas oĂč on avait plus d'Ă©lĂ©ments Ă  gauche on a bien le comportement normal de Perl qui fait du mieux qu'il peut et retourne un maximum d'Ă©lĂ©ments. Mais si un tableau s'Ă©tait glissĂ© dans le groupe alors seulement un Ă©lĂ©ment Ă©tait retournĂ©. #### La mort de "dollar dash" Fix d’une utilisation du tas aprĂšs un free ou un buffer overflow avec la variable dĂ©prĂ©ciĂ©e ``$#`` ([plus d'infos sur cette variable](https://perldoc.perl.org/perlvar.html#Deprecated-and-removed-variables)). Attention ``$#`` n'est PAS ``$#array``. On en reparle en **5.30.0** #### Autre - Plus de crash lors en utilisant **setlocale** avec certaines valeurs (bug libc). - Fix d'un memory leak avec les **captures nommĂ©es** (chercher par [ici](https://perldoc.perl.org/perlvar.html#Variables-related-to-regular-expressions)) - Un fix sur la commande magique et mystĂ©rieuse [formline](https://perldoc.perl.org/perlform.html) - Un autre fix sur un accĂšs possible Ă  de la mĂ©moire libĂ©rĂ©e avec **formline** - Le combo regex et smart match ne fonctionnait pas bien (smart match converti en regex), c'est fixĂ© - Fix bug dans des cas obscurs contenant [?{code}](https://perldoc.perl.org/perlre.html#Embedded-Code-Execution-Frequency) qui permet d'exĂ©cuter du code dans une regex - De mĂȘme forcer un local dans un **?{}** pouvait rester bloquĂ© Ă  la sortie. - **use utf8** concerne bien le fichier dans sa globalitĂ© Ă  prĂ©sent alors qu'avant seules les parties entre quotes Ă©taient concernĂ©es. - Fix range operateur **..** pour fonctionner avec les **unicode_strings** - Bugfix d'une allocation insuffisante par **split** sans pour autant ĂȘtre un problĂšme de sĂ©curitĂ© (inexploitable...) - Bugfix implĂ©mentation de [sort()](https://metacpan.org/pod/perlfunc#sort) avec des grands entiers - Fix coredump gĂ©nĂ©rĂ© par **chop** ou **chomp** et ce genre de code `chop(@x =~ tr/1/1/)` - Un commentaire dans une regex avec modifier **/x** pouvait ĂȘtre ignorĂ© parfois, c'est fixĂ©. - Ignorer `{}->$x` plutĂŽt que crasher quand `$x` n'est pas dĂ©fini. - Des lectures de donnĂ©es non initialisĂ©es dans un cas trĂšs particulier de `tr///` ou avec une **backreference comme 1憆** - Bugfix de crash possible ou rĂ©clusion infinie avec les forward dĂ©claration comme `sub c { sub c; }` - Fix assertion failure dans des regex utilisant des **regex_sets** - Fix crash d'un code invalide comme `\sort = 1`. - Fix d'un crash possible avec **evalbytes** (vu en 5.24.3) - Fix d'erreurs de lexer. - Plusieurs problĂšmes de regex avec utf8 (crash avec `s///` et buffer overflow) - Fix segfault avec option **-DC** (pas grave, c'est du debugging) - Fix lexer sur ce genre de chose (notez le backslash en dernier) ``print "<<`\"``. En fait l'interpreteur va lire trop loin car il ne trouve pas la fin (il est dupĂ© par les caractĂšres Ă©chappĂ©s). - Dans certains cas le tri en place `@tab = sort { ... } @tab` pouvait crasher. C'est fixĂ© - Fix report de warning inappropriĂ© avec [pack("p", ...)](https://perldoc.perl.org/functions/pack.html) - Plus de memory leak sur des tests de dĂ©finition de typeglobs (dĂ©jĂ  parlĂ© avant) comme `defined *{'!'}` - Le classique format **%a** du printf a eu de nombreux fixes et Ă©galement le support pour **subnormals** (ou **denormals**) c'est Ă  dire les nombres flottants Ă  virgules trĂšs trĂšs petits. - Plus de warnings sur `@DB::args`. Profitons-en pour parler de [DB](https://perldoc.perl.org/DB.html) qui est une interface pour accĂ©der au debugger perl. Et **@DB::args** contient les arguments de la fonction courante. Warning prĂ©sent qu'avec le switch **-w** et non le **use warning blablabla** - Plus de warning non plus sur les **builtin tableaux**. Le warning **Possible unintended interpolation...** Ă©tait en fait liĂ© au fait que les tableaux n'Ă©taient pas dĂ©clarĂ©s (or ils n'ont par dĂ©finition pas besoin de dĂ©claration car intĂ©grĂ©s Ă  perl) - Fix d'une rĂ©gression de **5.24** sur `tr/\N{U+...}/foo/` avec le caractĂšre compris entre 128 et 255. C'est fou le nombre de bugs autour d'Unicode... :/ - Les dĂ©limiteurs de chaine c'est Ă  dire le caractĂšre spĂ©cial comme `q//` ou `q??` ou `qmm` ne pouvait pas ĂȘtre un code point trop grand car confondu avec d'autres caractĂšres. Dans les faits ça signifie que `q\x{fffffff}machaine\x{fffffff}` ne marchait pas. - Un code faux comme `@{\cX` (dĂ©rĂ©fĂ©rencer un tableau caractĂšre de contrĂŽle) puis retour Ă  la ligne crashait en plus de donner une erreur de syntaxe. - Fix d'un crash quand on joue avec les stash et typeglobs comme ceci `sub P::f{} undef *P::; *P::f =sub{};`. Fonction **f** dans stash **P**. Suppression du symbole **P**. RedĂ©finir fonction **f** dans symbole **P** inexistant. - Meilleur report pour `/(?<=/` et `/(?@*` ou `->%*` ou `->$*`) produisait une assertion failure alors qu'il ne faut pas. Attention les symbolic ref sont dĂ©conseillĂ©es Ă  l'usage notamment si on utilise **use strict**. - Bugfix sur un assignement de liste. En rapport avec la _stack de la mort_ (f3ar !). Plus d'infos en **5.28.0**. - Fix d'un crash de perl quand on veut mettre un [attribut](https://perldoc.perl.org/attributes.html) Ă  une variable globale mais qu'une fonction existe dĂ©jĂ  avec ce nom. Je pense que les attributs sont en quelque sorte des **decorators**. Les attributs sur les variables globales sont gĂ©rĂ©s Ă  la compilation. On trouve plus d'explications [ici](https://stackoverflow.com/questions/987059/how-do-perl-method-attributes-work). - Tenter d'exĂ©cuter une **rĂ©fĂ©rence de fonction** qui a Ă©tĂ© dĂ©clarĂ©e Ă  travers un **typeglob** sur le **stash main** comme ceci `$::{"A"} = sub {}; \&{"A"}` peut produire un crash (il faut aimer le risque). C’est fixĂ©. - Bugfix sur `atof2()`. - Des bugs occasionnels sur certains caractĂšres UTF8. Le bug est initialement reportĂ© par [Benjamin Bayart sur la liste debian](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864782) puis gĂ©rĂ© dans le gestionnaire de tickets Perl. Bugs *occasionnels* car ça crash 50% du temps environ. - La mise en place du code pour **gĂ©rer les exceptions perl est paresseuse**, tellement paresseuse que certaines exceptions pouvaient apparaĂźtre avant la fin de la mise en place et le code pouvait sauter Ă  une adresse pas encore bien configurĂ©e et crasher. C’est fixĂ© :) - Une rĂ©gression (malgrĂ© un cas de test) sur le parsing des classes de **caractĂšres POSIX**. perl simplement reportait des warnings lĂ  oĂč il n'y a pas lieu d'ĂȘtre. ## 5.26.2 ### SĂ©curitĂ© - **[CVE-2018-6797]** Un fix sur encore un problĂšme de regex avec **\N{U+0}**. Quand on lit le ticket, honnĂȘtement on peut tirer son chapeau Ă  ces *uber programmers* qui arrivent Ă  fixer ce genre de problĂšme. - **[CVE-2018-6798]** Possible buffer overflow avec une regex contenant **\x{nombre}** avec modifier **case insensitive** applique sur une autre valeur **\x{nombre}** - **[CVE-2018-6913]** ProblĂšme avec pack avec un nombre d'item trĂšs large. On a dĂ©jĂ  vu ça par le passĂ©, mais c'Ă©tait pas la mĂȘme root cause. ### Bugfixes #### Regex alambiquĂ©es J'aime le terme utilisĂ© pour dĂ©crire les regex qui produisent ce bug. Il est dit *convoluted kinds of regexp* qui se traduit par *alambiquĂ©es*. À quoi ressemble une **regex alambiquĂ©e** ? Eh bien ça ressemble Ă  ça : ```perl '0(0?(0||00*))|' ``` #### Rapport d’erreur et arrĂȘt plus prĂ©coce PlutĂŽt que d'essayer de donner de meilleurs messages d'erreur en crashant parfois, certaines **erreurs vont ĂȘtre reportĂ©es plus tĂŽt et s'arrĂȘter ensuite**. Comme on peut voir, de trĂšs nombreux bug fix concernent du code incorrect. Un code qui crash peut au minimum est utilisĂ© pour faire un DoS, donc il faut le prendre au sĂ©rieux. #### Autre - Plus de vĂ©rifications Ă  la compilation pour **readpipe()**, ça Ă©vite la corruption Ă  l’exĂ©cution. - Fix un **use-after-free** bug lorsqu'on a des espaces et des retours Ă  la ligne aprĂšs une dĂ©claration partielle de fonction. - Un fix du tokenizer sur le parsing des identifiers avec espaces. - L'aliasing des variables **$a** et **$b** variables magiques au sein d'un sort Ă©tait mal fait et un nouvel alias n'Ă©tait pas forcement comptĂ© alors qu'un unalias Ă©tait bien notĂ©. Cela pouvait entrainer un free sur variable alors qu'elle n'Ă©tait plus comptĂ©e comme utilisĂ©e et perl n'Ă©tait pas d'accord. - Bug avec **-flto** et **-mieee-fp**. **-flto** on en a dĂ©jĂ  parle (optimiser la vitesse de compilation) quant Ă  **-mieee-fp**, il sert Ă  *ContrĂŽler ou non si le compilateur utilise des comparaisons Ă  virgule flottante IEEE. Ce qui permet de gĂ©rer correctement le cas oĂč le rĂ©sultat d'une comparaison est non ordonnĂ©.* (**man gcc**) ## 5.26.3 ### SĂ©curitĂ© #### Faille dans Archive::Tar **[CVE-2018-12015]** Un bug intĂ©ressant. L'implĂ©mentation de tar dans Perl est Archive::Tar qui permet de faire tout ce que vous pouvez faire en ligne de commande. Normalement **Archive::Tar** empĂȘche d'extraire en dehors du rĂ©pertoire courant mais une feinte avec un symlink permet de bypasser facilement cette limitation. Je reprends l'exemple trĂšs bien expliquĂ© du [ticket](https://rt.perl.org/Public/Bug/Display.html?id=133250) de Jakub Wilk : ```bash tar -tvvf traversal.tar.gz lrwxrwxrwx root/root 0 2017ćčŽ09月30æ—„ 15:36 moo -> /tmp/moo -rw-r--r-- root/root 4 2017ćčŽ09月30æ—„ 15:36 moo pwd /home/jwilk ls /tmp/moo ls: cannot access '/tmp/moo': No such file or directory perl -MArchive::Tar -e 'Archive::Tar->extract_archive("traversal.tar.gz")' ls /tmp/moo /tmp/moo ``` #### Autre - **[CVE-2018-18311]** En mettant une valeur trĂšs grande dans une variable d'environnement par exemple une trĂšs grande chaine composĂ©e de la mĂȘme lettre 0xFFFFFFFF fois on peut Ă©crire aprĂšs le buffer allouĂ©. C’est fĂącheux. - **[CVE-2018-18312]** (basĂ© sur **\x**), **[CVE-2018-18313]** (basĂ© sur **\N{}**) et **[CVE-2018-18314]** (base sur les **classes de caractĂšre Ă©tendus**) Des regex peuvent crasher Ă  la compilation et lire aprĂšs le buffer ou bien Ă©crire aprĂšs # Sortie de Perl 5.28 ## 5.28.0 ### AmĂ©liorations du core de perl #### Hash slices et slices clĂ©/valeur En **5.20.0** ont Ă©tĂ© ajoutĂ©es 2 nouvelles sortes de **slice** : les [key/value hash slices](https://metacpan.org/pod/perldata#Key/Value-Hash-Slices) et les [index/value array slices](https://metacpan.org/pod/perldata#Index/Value-Array-Slices). Ces 2 sortes de slices s'appliquent sur un **hash** contrairement aux [slices de base](https://metacpan.org/pod/perldata#Slices). Les **key/value hash slice** sont en fait un façon d'obtenir un *sous ensemble* d'un hash par exemple en faisant `my %petit = %grand{'cle1', 'cle2'};` qui va sĂ©lectionner les deux paires de clĂ©/valeurs pour faire un nouveau hash. Les **index/value array slice** suivent un peu le mĂȘme principe mais on sĂ©lectionne avec les index et on rĂ©cupĂšre une liste *index/valeur*. Voici un exemple : `@petit = %grand[1,3];` Les slices *standard* (si on peut dire) s'appliquent sur les tableaux et permettent Ă©galement de rĂ©cupĂšre un sous tableau : ```perl perl -e 'my @joueuses = ("le sommer", "gauvin", "henry", "thiney", "cascarino"); print join " ", @joueuses[1,3,4]; print "\n";' gauvin thiney cascarino ``` Avec **5.28.0** on peut maintenant utiliser **delete** sur les **array slices** et **hash slices** c'est Ă  dire pas du tout ce que je viens de prĂ©senter :-) Un exemple : ```perl my %hash = ( cle1 => "valeur1", cle2 => "valeur2", cle3 => "valeur3" ); delete @hash{cle2}; foreach my $k (keys %hash) { print "$k\n";} ``` qui donne ```bash cle3 cle2 ``` Attention, comme on peut le voir, le sigil a changĂ© c'est bien **@hash{}** avec un arobase. En Perl, il peut exister **@var**, **$var** et **%var** simultanĂ©ment. Pour s'en convaincre, ajoutons une autre variable **@var** : ```perl my @var = ("a", "b"); my %var = ( cle1 => "valeur1", cle2 => "valeur2", cle3 => "valeur3" ); delete @var{cle2}; foreach my $k (keys %var) { print "$k\n";} print @var; ``` qui donne ```bash cle1 cle3 ab ``` #### Regex lookaround Des synonymes pour les expressions [lookaround](https://www.regular-expressions.info/lookaround.html) qui sont des expressions regex pour tester des choses comme : ```perl /foo(?=bar)/ ``` *je veux le mot foo suivi par le mot bar mais sans l'inclure dans le match*. Quel est l'avantage des **lookaround assertions** ? (oui assertions car on parle de tester sans consommer le caractĂšre) En fait examinons un cas simple ou je veux matcher un **a** qui n'est pas suivi par un **b**. Si j'utilise une classe de caractĂšre avec nĂ©gation `a[^b]` ça signifie *un a SUIVI par quelque chose et cette chose est autre chose que b*... Donc la chaine "archlinux" va matcher et le match va contenir "ar". Mais la chaine "fedora" ne va pas matcher... Car il n'y a rien aprĂšs le "a". GrĂące Ă  un **lookaround assertion** comme ceci `a(?!b)` (**lookahead negatif**) on va matcher les deux chaines et on aura bien que le "a" mĂȘme pour "archlinux". #### Autre - Support de [unicode 10.0](http://www.unicode.org/versions/Unicode10.0.0/) qui ajoute environ 8500 caractĂšres dont le signe bitcoin, des Ă©mojis encore dont la tĂȘte qui explose et les magiciens/fĂ©es/sirĂšnes - Meilleure gestion des **unicode script run** - L’édition en place avec -i devient safe. Une copie du fichier Ă  traiter est faite pendant le travail. `perl -i.bak` va prendre le fichier en entrĂ©e et s'en servir comme output (en faisant au prĂ©alable un backup ici avec l'extension **.bak**. Si on ne prĂ©cise pas d'extension, le mode legacy unsafe est utilisĂ©. - Une variable lexicale persistante peut maintenant ĂȘtre dĂ©clarĂ©e et initialisĂ©e si c'est un tableau ou un hash par exemple `state @a = qw(x y z)`. Une variable persistante c'est une variable qui garde sa valeur entre les appels de fonction. - Sur les plateformes qui utilisent des inodes plus grandes que le type entier natif de Perl, Perl gĂšre maintenant ces inodes dans des chaines. - Une petite amĂ©lioration concernant **sprintf %j** (choisit la taille du champ) - Les filehandles sont plus souvent ouverts avec le flag **close-on-exec** ce qui protĂšge de passer accidentellement le filehandle Ă  un autre programme. - La feature **bitwise** en **5.28.0** n'est plus expĂ©rimentale !! Hourra !! - Le changement de locale est thread safe sur les plateformes qui le gĂšrent. La variable **${\^SAFE_LOCALES}** sert justement Ă  dire si la plateforme est locale thread safe ou non. ### SĂ©curitĂ© - On retrouve les CVE de **2.26.1** donc **[CVE-2017-12837]**, **[CVE-2017-12883]** et **[CVE-2017-12814]** - En **5.26.0** de nombreux algo de hash ont ete retirĂ©s des options **Configure**. En 5.28.0 ajoute des options pour configurer les principaux algos : - **-DPERL_HASH_FUNC_SIPHASH** - **-DPERL_HASH_FUNC_SIPHASH13** - **-DPERL_HASH_FUNC_STADTX** - **-DPERL_HASH_FUNC_ZAPHOD32** - **-DPERL_HASH_USE_SBOX32_ALSO=0** - **-DSBOX32_MAX_LEN=16** ### Changements incompatibles #### Here-docs sans delimiteur GĂ©nĂ©ralement on utilise les **heredocs** avec un texte de fin comme `__END__`. Mais on peut Ă©galement utiliser une ligne vide comme dĂ©limiteur : ```perl my $var = <<""; toto print $var ``` Ou encore la version implicite : ```perl my $var = <<; toto print $var ``` Cette derniĂšre version Ă©tait dĂ©prĂ©ciĂ©e et devient interdite. #### Readline delimiteur Mettre une valeur bizarre dans **$/** qui sert Ă  dire Ă  Perl quel est le dĂ©limiteur de ligne (quand on lit ligne par ligne). Il n'est plus autorisĂ© de mettre une valeur nĂ©gative. Cette valeur est utilisĂ©e par le **readline** ou **** et Ă©galement par **chomp()**. Exemple si on dit Ă  Perl que le sĂ©parateur de ligne est la lettre **b** : ```perl $/ = "b"; while() { print "[$_]\n"; } ``` Et on pourra tester avec un : ```perl echo -n "ababa" | perl sep.pl ``` Le sĂ©parateur peut ĂȘtre **plusieurs lettres** ou **undef** dans ce dernier cas un readline va simplement lire toute l'entrĂ©e en une fois. Petite prĂ©cision, le contenu de **$/** ne peut pas ĂȘtre une regex. #### Yada yada usage restreint L'opĂ©rateur [yada yada](https://perldoc.perl.org/5.14.0/perlop.html#Yada-Yada-Operator) qui sert de placeholder pour le code non implĂ©mentĂ© (lance une exception *unimplemented*). Il Ă©tait acceptĂ© comme **expression** autorisant ce genre de chose ``... . "toto"`` Or il ne doit ĂȘtre acceptĂ© que comme **statement**. Pas de panique (oui j'en vois qui paniquent xD), on pourra toujours simuler une **expression** avec ``do{...}``. #### Algo de tri Les subpragamata de **sort** pour choisir l'algorithme de classement disparaissent. Restent le [pragma sort](https://metacpan.org/pod/release/XSAWYERX/perl-5.30.0/lib/sort.pm) pour spĂ©cifier la stabilitĂ© du classement : ```perl use sort 'stable'; # guarantee stability use sort 'defaults'; # revert to default behavior no sort 'stable'; # stability not important ``` #### Autre - Changements dans le feature expĂ©rimentale des signatures et les attributs (l'attribut ne se place plus au mĂȘme endroit) - Attribut **:locked** et **:unique** supprimĂ©s. Ces [attributs](https://perldoc.perl.org/attributes.html) Ă©taient utilisĂ©s pour le multithreading, or la gestion du multithreading a changĂ© et ces attributs ne servent plus Ă  rien depuis longtemps. C'Ă©tait prĂ©vu depuis 5.12 et 5.10, il fallait s'y attendre :D - L'expression vide `\N{}` devient fatale. Cette expression ne fait strictement rien. - Ouvrir un filehandle et un dirhandle dans la mĂȘme variable n'est plus autorisĂ©. - Interdiction de donner des codes Unicode au-delĂ  de **IV_MAX** (dĂ©pend de la plateforme). Plus d'infos sur l'entrĂ©e dans [perldeprecation](https://metacpan.org/pod/distribution/perl/pod/perldeprecation.pod#Limit-on-the-value-of-Unicode-code-points.) - **B::OP::Terse** disparait au profit de **B::Concise::b_terse**. Le module **B** est un core module qui sert Ă  aller fouiller dans le backend du compilateur de Perl. - Une [feature accidentelle](https://metacpan.org/pod/distribution/perl/pod/perldeprecation.pod) de **AUTOLOAD** est supprimĂ©e. Qu'est-ce exactement qu'[autoload](https://perlmaven.com/autoload) ? [L'autoloading](https://perldoc.perl.org/perlsub.html#Autoloading) est une façon de dĂ©finir un comportement par dĂ©faut pour les fonctions non dĂ©finies. - Plus de backslash pour Ă©chapper les **:** dans le **PATH** (sĂ©curitĂ©...) - Plus d'option **-DH** pour builder perl, c'est cassĂ© depuis longtemps. - En octal ou binaire il Ă©tait possible de donner des nombres hors base aprĂšs la virgule dans un nombre a virgule flottante. Ce bug est fixĂ©. - Changement de comportement de **unpackstring()** en C. ### DĂ©prĂ©ciations #### DĂ©marrer ses tableaux avec un index original Changer la valeur de **$[** va devenir interdit. Cette variable magique permet de changer l'index de dĂ©part d'un tableau (pour s'amuser ou pour s'approcher du style de certains autres outils comme fortran). En effet, la philosophie de Perl est [TIMTOWTDI (Tim Toady)](https://en.wikipedia.org/wiki/There%27s_more_than_one_way_to_do_it) mais dans ce cas bien prĂ©cis, changer la valeur de **$[** dans un coin d'un programme peut rendre un programme totalement illisible et pose des problĂšmes de maintenabilitĂ© donc. On peut utiliser un autre module pour faire ça si on en a vraiment besoin. On peut suivre [la vie de $\[ sur perlbanjo](https://perlbanjo.com/ce05247450). #### Autre - On ne doit plus utiliser **vec** avec des chaines ayant des points de code aprĂšs **0xff** car leur reprĂ©sentation se fait en UTF8 et [vec travaille sur des bits](https://perldoc.perl.org/functions/vec.html). - En **5.26.0**, l'usage des accolades non Ă©chappĂ©es dans un regex devenait **fatal**. Fait intĂ©ressant, ça avait [cassĂ© GNU autoconf](https://lists.gnu.org/archive/html/bug-automake/2017-06/msg00002.html) et c'est un cas intĂ©ressant de *gros logiciel* qui fait plier une *dĂ©pendance* puisque Perl a fait un fix de derniĂšre minute pour ĂȘtre plus laxiste vis Ă  vis des accolades. Ce fix est dĂ©sormais appliquĂ© pour tout le monde :) - BientĂŽt plus d'arguments pour **hostname()** ### Mises Ă  jour de modules #### Suppression de Local::Codes du core Suppression prĂ©vue de **Local::Codes**. La suppression est demandĂ©e par son auteur, Dans le cadre de cette suppression et [comme discutĂ© sur la liste](https://lists.gt.net/perl/porters/338584?search_string=Locale-Codes;#338584), les autres modules cpan qui consomment cette dĂ©pendance doivent se mettre Ă  jour et il est donc nĂ©cessaire de les prĂ©venir. J'en profite pour glisser un lien qui permet de [lister les dĂ©pendances DECLAREES d'un module cpan](http://deps.cpantesters.org/depended-on-by.pl?dist=Locale-Codes). Les modules qui posent problĂšme n'apparaissent pas dans cette page. #### Autre - Suppression de **B::Debug**. - Suppression du pragma `use vars` partout oĂč c'est possible. - Remplacer [DynaLoader](https://perldoc.perl.org/DynaLoader.html) par [XSLoader](https://perldoc.perl.org/XSLoader.html). **Dynaloader** et **XSLoader** sont des modules Perl pour faire du **dynamic linking** en gros du **dl_open**. - MAJ de **Archive::Tar** suite au fix de sĂ©curitĂ© en **5.26.?**.? - MAJ de **B::Deparse** et fix bug avec les attributs - MAJ **Carp**. Bug fix sur la constante **ISA**, le comptage des rĂ©fĂ©rences et l'overloading. - MAJ de **zlib** pour fixer un **problĂšme de sĂ©curitĂ©** de la lib zlib - AmĂ©lioration de **Data::Dumper** output - [Devel::PPPort](https://metacpan.org/pod/Devel::PPPort) prend du grade et devient core module - **File::Copy** utilise **Time::HiRes** si possible - **POD::Html** gĂ©nĂšre un title - On fait plus attention aux locales dans le module POSIX. - **XSLoader** doc - Suppression compatibilitĂ© **VMS::stdio** ### Performances #### Multi Concat Les concatĂ©nations multiples sont optimisĂ©es donc ```perl. my $var = "a"; $var .= "$b $c $d\n" ``` est vue comme une seule concatĂ©nation. En parlant du temps de concatĂ©nation, on perd en performance des qu'on mĂ©lange constantes et variables et **utf8** et non **utf8** chaine mais c'est aussi lĂ  qu'il y a le plus Ă  gagner en terme de performances :) **sprintf** aussi bĂ©nĂ©ficie de cette amĂ©lioration. #### Require Appeler [require](https://perldoc.perl.org/functions/require.html) sur un module dĂ©jĂ  chargĂ© est plus rapide. **require** est une fonction qui permet soit de spĂ©cifier une version Perl, soit d'exĂ©cuter un code externe. Voici une [belle explication stackoverflow](https://stackoverflow.com/a/2181778) sur la diffĂ©rence entre do/use/require mais en gros : - **use** : lit fichier, vĂ©rifie, exĂ©cute et fait import - **require** : lit fichier une fois, vĂ©rifie et exĂ©cute - **do** : lit et exĂ©cute fichier #### Autre - Perl **plus rapide au dĂ©marrage de la compilation des `p{}`** ([propriĂ©tĂ©s unicodes](https://perldoc.perl.org/perluniprops.html#Properties-accessible-through-%5cp%7b%7d-and-%5cP%7b%7d)) - **ref()** devient plus rapide car il ne construit plus la reprĂ©sentation chaine de caractĂšre. - **keys** appliquĂ© sur rien ou sur une variable qui n'est pas un hash est plus rapide. - Le classique `if(index() != -1) { #J'AI PAS TROUVE :/ }` est optimisĂ© - Optimisation des boucles **for** (et **foreach** car je rappelle que **for** et **foreach** sont des *alias* en Perl) - Le core module [File::Glob](https://perldoc.perl.org/File/Glob.html) recoit des optimisations. Ce module sert Ă  faire ce genre de chose `my @sources = <*.{c,h,y}>;` soit les **BSD glob routines**. - Optimisations sur des fonctions retournant des entiers qu'on utiliserait par exemple en contexte boolĂ©en. - Petite optim sur le **parsing des noms de symboles** - Meilleures perf pour les classes de caractĂšre ascii `[[ascii]]`. - Des optimisations sur certaines regex. Dans de bonnes circonstances, on peut gagner pas mal. - D'autres optimisations concernant la gestion d'**UTF8** ### Compilation et plateformes - **C89 minimum** requis ! Documente depuis **1998** - Option **GCC** **-Werror=pointer-arith** par dĂ©faut. On peut toujours faire de l'arithmĂ©tique de pointers, mais pas avec n'importe quoi - Ajout d'un [.travis.yml](https://github.com/Perl/perl5/blob/blead/.travis.yml) pour que les devs qui forkent perl sur github puissent avoir le build dans **Travis CI**. Le [git officiel de Perl5](https://perl5.git.perl.org/perl.git) est sur git.perl.org mais il y a un [miroir sur github](https://github.com/Perl/perl5) - Plus de support du format **.bz2**, seuls les formats **.xz** (compresse mieux et plus vite) et **.gz** (peu gourmand en mĂ©moire) seront utilisĂ©s - **Centos 5** fixĂ© - Suppression de **PowerUX** et **Power MAX OS** - **Cygwin** <3 **quadramath** - Perl utilise correctement les fonctions [rĂ©entrantes](https://fr.wikipedia.org/wiki/R%C3%A9entrance) de **Darwin** - Perl s'aligne sur **-O2** sur **FreeBSD** ### Changements internes #### Weak references Nouvelle fonction **sv_rvunweaken()** qui complĂšte **sv_rvweaken()**. Weaken ou unweaken sont en rapport avec les [weak references](https://en.wikipedia.org/wiki/Weak_reference). Une weak rĂ©fĂ©rence en Perl n'incrĂ©mente pas le compteur de rĂ©fĂ©rence pour l'objet, et donc ne protĂšge pas l'objet d'une ~~garbage collection~~ destruction Ă  cause du compteur de rĂ©fĂ©rence qui fait son mĂ©nage. Les rĂ©fĂ©rences sont liĂ©es Ă  leurs scopes donc une variable dans une boucle pourra ĂȘtre dĂ©truite dĂšs la sortie de la boucle. #### UTF8 invariance Ajout de la fonction [is_utf8_invariant_string_loc](https://perldoc.pl/perlapi#is_utf8_invariant_string_loc) qui fait comme [is_utf8_invariant_string](https://perldoc.pl/perlapi#is_utf8_invariant_string) mais assigne l'index de l'endroit oĂč on trouve le premier caractĂšre variant. Si j'ai bien compris le principe, il s'agit de vĂ©rifier les caractĂšres qui sont encodĂ©s de la mĂȘme maniĂšre en ASCII ou en UTF8 c'est Ă  dire que **A** est code **01000001** en ASCII et **01000001** en UTF8 donc c'est *invariant*. Mais **Ă©** est codĂ© **11101001** en ASCII et **11000011 10101001** en UTF8 donc c'est *variant*. #### Changement de locale Nouvelle fonction [sync_locale](https://perldoc.perl.org/perlapi.html#sync_locale) pour synchroniser les threads au niveau du local mĂȘme si la doc prĂ©cise que *changer la locale est [antisocial](https://www.youtube.com/watch?v=WfD8Dnh2xho) et dangereux sur les systĂšmes multi-threadĂ©s qui n'ont pas d'operations locales multi-thread safe*. #### Autre - L'outil [perlbug](https://perldoc.perl.org/perlbug.html) qui sert Ă  envoyer des rapports de bugs, reçoit un argument **--help** et **--version**. Vous n’avez plus aucune bonne raison de ne pas reporter un bug si vous en dĂ©couvrez un. - AmĂ©lioration du **multithreading** - Nouveau flag **SORTf_UNSTABLE** pour forcer le comportement instable du mergesort lorsqu'on spĂ©cifie `no sort stable`. - Pour les modules XS donc *non pure-perl* on peut spĂ©cifier `#define PERL_REENTRANT` pour que les fonctions [reentrantes](https://fr.wikipedia.org/wiki/R%C3%A9entrance) soient utilisĂ©es (et ce de maniĂšre transparente). - En **5.26.0** le build par dĂ©faut se faisait avec **PERL_OP_PARENT** qui permet Ă  un opĂ©rateur de connaĂźtre son parent. À partir de **5.28.0**, son contraire **PERL_NO_OP_PARENT** n'est plus supportĂ©. - Nouveau define pour le compilateur **THX_DEBUGGING** qui permet d'avoir le _thread contexte_ pour le **XS** et **C** - Nouvelle fonction [setlocale](https://perldoc.perl.org/perllocale.html#The-setlocale-function) qui est **thread safe**. - Nouvelle sorte de scalar magique, le **nonelem scalar** ### Correction de bogues #### La stack de la mort Dans certains cas trĂšs rares un assignement de liste pouvait faire l'allocation sur la *stack de la mort* (ou *mortal stack*) au lieu de de l'allouer correctement. Cela laissait l'entrĂ©e non assignĂ©e et pouvait provoquer un crash. D'aprĂšs la documentation : *Pour une ref, ĂȘtre "mortelle" signifie qu'elle est possĂ©dĂ©e par la stack temporaire, une des nombreuses stack internes de perl, et qu'elle va ĂȘtre dĂ©truite "dans pas longtemps"*. (cf [perlguts](https://perldoc.perl.org/perlguts.html#Reference-Counts-and-Mortality)) #### Stringification Un peu de fork. Depuis **5.16.0**, la **stringification** des arguments de system se faisait plus tard et donc on a ce comportement : ```perl print $$; system 'echo', "$$"; system 'echo', $$; 32480 32480 32488 ``` Notez bien le dernier, la conversion de ```perl $$ ``` en ```perl "$$" ``` se fait dans le fils et non le parent. Ce fut l'objet d'un fix en **5.28.0** #### eval fait son mĂ©nage **eval** fait mieux le mĂ©nage en nettoyant par exemple ``$@`` qui contient le message d'erreur d'eval. C'est dĂ©bile vous allez dire ?! Car on veut cette valeur si le **eval** n'a pas rĂ©ussi... Oui et non (spoiler c'est non) : si on enchaine les **eval**, par exemple le premier eval plante puis le second est un succĂšs (donc ne met rien dans cette variable), alors on aura une variable **$@** polluĂ©e avec le message d'erreur du premier **eval**. C'est donc utile dans le cas de **eval imbriquĂ©s**. #### Autres - Meilleure gestion de **split** avec Unicode. En gros, les caractĂšres Unicode codĂ©s sur un byte mais n'Ă©tant pas du ASCII et reprĂ©sentant un espace n'Ă©taient pas reconnus par split. - Les variables magiques de capture de regex peuvent ĂȘtre indexĂ©es dans les chaines donc **"${\^CAPTURE[0]}"** peut ĂȘtre utilisĂ© pour aller chercher le premier Ă©lĂ©ment du tableau **@{\^CAPTURE}** - Si une variable avec un nom en **UTF8** Ă©tait dĂ©clarĂ©e comme symbole puis supprimĂ©e et dĂ©clarĂ©e mais sans **UTF8**, alors elle Ă©tait toujours **flaguĂ©e UTF8**. On parle bien du nom de la variable. - **sprintf** retravaillĂ©e pour corriger des petits bugs sur la spĂ©cification de longueur et la reprĂ©sentation d'entier larges. Et la fonction est plus rapide Ă©galement ! - Perl partait en erreur si aucun exposant n'est donnĂ© dans ce genre d'expression `1e--3`. - Une regex de match comme ceci `m/$nada/` avec **$nada** qui est juste vide ne va plus ajouter le modifier **/o** si le match prĂ©cĂ©dent l'avait. En parlant des [autres modifiers](https://perldoc.perl.org/5.22.0/perlre.html#Modifiers), voilĂ  ce que dit la doc a propos de **/o** : "prĂ©tend optimiser votre code, mais en fait introduit des bugs" :D :D :D - Jouer avec les opĂ©rations I/O sur des non-glob fait des erreurs avec `${^LAST_FH}`. C'est fixĂ© - Certaines fonctions XS font de meilleures vĂ©rifications (tester si le pointeur donnĂ© en paramĂštre est nul) pour Ă©viter des comportements indĂ©finis. - Pour donner des valeurs par dĂ©fauts aux paramĂštres d'une fonction (donc en mode signature expĂ©rimental) il faut utiliser **=**. D'autres operateurs Ă©taient possibles, mais par erreur. - Les warnings Ă©mis par **prototype** incluent Ă  prĂ©sent le package. - Fix bug avec [exec](https://metacpan.org/pod/release/XSAWYERX/perl-5.30.0/pod/perlfunc.pod#exec-PROGRAM-LIST) lorsque LIST est vide comme ça : `exec {"true"} ()` - On peut de nouveau exĂ©cuter des commandes d'une seule lettre avec l'argument concatĂšne dans le debugger comme `p$^V`. - Splice devient consistant avec push et renvoie une erreur si on essaie de la faire travailler sur un tableau read only. - **stat** (plein d'infos sur un fichier) et **lstat** (pareil mais sur un symlink). Et la variable magique **$!** est bien settĂ©e si un problĂšme arrive. - Lorsqu'on fait des tests sur un fichier et que certaines opĂ©rations ne sont pas possibles car n'existent pas sur cette plateforme, Perl va d'abord vĂ©rifier si le fichier existe et Ă©ventuellement donner un message d'erreur plus fin avant de se prĂ©cipiter Ă  dire "pas dispo sur cet OS de faible". - Encore des bugfix en rapport avec `\N{}` soit un leak de mĂ©moire quand c'est vide, soit un problĂšme avec le **transliteration operator in perl** (c'est le nom de **tr///**) - Essayer d'exĂ©cuter un rĂ©pertoire ou un device de block avec **do** c'est con, mais bon perl retourne Ă  prĂ©sent un message d'erreur comprĂ©hensible. - Alors lĂ  accrochez-vous, dans une regex de substitution, si on met du code qui retourne un texte Ă  l'aide d'une fonction [overloadĂ©e](https://perldoc.perl.org/overload.html#Fundamentals) comme **""**, alors on avait un problĂšme de taintification (gestion des inputs safe/non safe). - Un autre problĂšme avec **do** et la dĂ©claration de fonctions lexicales qui pouvaient altĂ©rer la stack. - Support de 64 bits pour **pack** et **unpack** - Fix d'une possible corruption de stack avec **reverse** sans argument. Un problĂšme de rĂ©allocation qu'on peut mettre en valeur avec `for0ăƒ‰ăƒ«(0..1000){()=(0..0,ăƒ‰ăƒ«scalar reverse)}` (reverse travaille dans ce cas sur **$_**). - Plus de problĂšme de rĂ©entrance avec **system**, **exec** et leurs amis. - Fix un problĂšme grave d'**allocation d'une grande quantitĂ© de mĂ©moire sur une machine 64 bits** (> 1 Giga) - Fix un crash avec les tests de fichiers empilĂ©s dans un sort (oui on peut trier sur beaucoup de choses exemple `sort { -s $a <=> -s $b } @files`). On pouvait reproduire le crash avec `sort{ -s -s -b } ()` tout simplement. - Fix d'un comportement indĂ©fini parfois quand perl lit un chiffre qui est tellement peu significatif qu'il ne peut modifier la valeur du nombre Ă  virgule. - **open** en plus d'ouvrir un fichier, crĂ©e un filehandle et l'ajoute Ă  la table des symboles. Donner une valeur bizarre, peut aboutir Ă  un memory leak. C'est le cas de `open $$scalarref` et c'est l'objet du fix. - Bug fix sur les typemaps. Un **typemap** est une façon de reprĂ©senter les input/output des fonctions C Ă  interfacer. - L'arrondi des nombres Ă  virgule avec perl est Ă  prĂ©sent juste (`printf %.0f`) - Fix une erreur **Cannot printf Inf with 'c'** quand un tableau commençait par **Inf** et qu'on avait une autre erreur - **getcwd** est amĂ©liorĂ© (retourne si erreur, set correctement **$!**) - Un trĂšs vieux bug ([2002](https://rt.perl.org/Public/Bug/Display.html?id=8910) !!) fixĂ© au sujet de la vivification des tableaux - Un autre trĂšs vieux bug (2001) fixĂ© Ă  propos d'accolades optionnelles et de dĂ©rĂ©fĂ©rencement - Des bugs sur `tr/non_utf8/long_non_utf8/c` avec des caractĂšres de remplacement trop grands et aussi sur `tr/non_utf8/non_utf8/cd` Ă  cause des modifier **cd** - Bugfix sur un problĂšme de nombre Ă  virgule flottante avec un sĂ©parateur qui n'est pas un point en environnement threadĂ© (quel rapport ?) - Fix certaines assertions failures dans la compilation de regex qui doivent ĂȘtre simplement des erreurs de compilation. ## 5.28.1 ### SĂ©curitĂ© **[CVE-2018-18311]** : Un overflow lors d'une addition d'entiers dans la fonction **Perl_my_setenv()** : ```perl void Perl_my_setenv(pTHX_ const char *nam, const char *val) { ... const int nlen = strlen(nam); ... vlen = strlen(val); new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char)); ``` **nam** et **val** sont la paire clĂ©/valeur et ici en donnant une ou des valeurs trĂšs grandes on peut obtenir un overflow d'entier. On alloue alors trop peu de place et ensuite quand on utilise **nlen** et **vlen** pour des memcopy on Ă©crit hors de la mĂ©moire allouĂ©e. **[CVE-2018-18312]** : Un sĂ©rieux bug qui peut faire un buffer/heap overflow. C'est Ă  cause d'une regex mal parsĂ©e. Et en ajoutant des caractĂšres de contrĂŽles non ASCII, on peut dĂ©placer le curseur dans la mĂ©moire. Vous voulez un exemple ? Vous ĂȘtes sĂ»rs ? OK (dĂ©solĂ©) `(?[(?^:(?[\\\x00]))\\]\x00|2[^^]\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80])R.\670憆` ### Corrections de bogues - L'optimisation faite en 5.28.0 sur la comparaison d'index -1 (souvenez-vous `if(index() != -1) { #J'AI PAS TROUVE :/ }`) produisait un warning dans la construction **when**. C'est fixĂ© - Un bug dans le matching regex de dĂ©cimaux par le biais des [scripts run](https://perldoc.perl.org/perlre.html#Script-Runs) - ProblĂšme avec l’édition en place (option **-i**) qui a Ă©tĂ© changĂ©e en **5.28.0**. Il y avait un nombre limitĂ© de fichiers aprĂšs quoi ça ne marchait plus. ## 5.28.2 ### Changements incompatibles Un changement sur les scripts run dans les regex. C'est un changement incompatible sur une "release patch" mais c'Ă©tait tout simplement cassĂ© alors ce n'est pas un problĂšme. ### Compilation et plates‐formes Compilation sur MAC OS X avec **-Duseshrplib** fonctionne avec **SIP** (System Integrity Protection = rĂ©duction des droits de root, certaines variables d'env pas partagĂ©es ce qui pose problĂšme pour le chargement dynamique de libperl, pendant le build). ### Corrections de bogues - L’édition en place avec -i est mieux gĂ©rĂ©e si le programme s'arrĂȘte mais n'a pas d'erreur, le fichier est bien Ă©crit. - Fix rĂ©gression de 5.28.0 lorsqu'on **stdin** dans le parent puis on rouvre dans l'enfant `close(STDIN); open(CHILD, "|wc -l")'`. C'est parce que stdin Ă©tait fermĂ© dans l'enfant aussi. - Fix un bug avec `pack "u"` quand il n'y a pas de deuxiĂšme argument. La valeur retournĂ©e Ă©tait mal terminĂ©e. **pack "u"** c'est pour [uuencode](https://fr.wikipedia.org/wiki/Uuencode) ça vous rappelle peut ĂȘtre quelque chose ? Moi des bouts de textes dans les ezines - Fix un bug avec **formline** et un format mal terminĂ©. # Sortie de Perl 5.30 ## 5.30.0 Le 22 mai 2019, Sawyer X a annoncĂ© [la sortie de Perl 5.30.0](https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254844.html). ### AmĂ©liorations du cƓur de Perl #### Lookbehind Ă  longueur variable On a dĂ©jĂ  parlĂ© des expressions de regex **lookaround** eh bien **5.30.0** accueille une nouvelle feature concernant les **lookbehind** (donc le **lookaround** vers l'arriĂšre). Il s'agit des [lookbehind Ă  longueur variable](https://metacpan.org/pod/perlre#(?%3C=pattern)) c'est Ă  dire par exemple ```perl /(?<=a{1,6}b)\w+/ ``` On peut donc faire ça avec cependant une limitation de longueur Ă  255. Et un warning est Ă©mis car le comportement n'est pas forcement bien dĂ©finitif. Cette limite s'applique uniquement au **lookbehind** car il n'y a pas de limitation de ce genre en **lookahead**. Et pour conclure, une [mĂ©thode pour Ă©muler cette feature](http://www.drregex.com/2019/02/variable-length-lookbehinds-actually.html) existait dĂ©jĂ  dans les versions prĂ©cĂ©dentes de Perl mais c'Ă©tait compliquĂ© (le lien c'est pour les guerriers). #### AdopteUnEmoji Support de **unicode 12.1**... Pourquoi pas **unicode 11** ? Parce que unicode a changĂ© son cycle de releasing donc ça rajoute unicode 11.0 (684 nouveaux caractĂšres) ainsi que unicode 12.0 (554 caractĂšres) et unicode 12.1 qui ajoute exactement 1 caractĂšre. Au fait, savez-vous qu'on peut [adopter un caractĂšre unicode](https://www.unicode.org/consortium/adopt-a-character.html) ? Google a par exemple adoptĂ© l'Ă©mojis *burger*, IBM le *nuage*, Ford des *voitures* et ballantine's... devinez :D #### Autres - Toujours cĂŽtĂ© regex, la [limite de longueur variable des expressions (quantifiers)](https://perldoc.perl.org/perlre.html#Quantifiers) passe Ă  65534 dans les expressions de ce type `{n,m}`. En ce qui concerne la version sans max comme ceci `{n,}` la valeur du max dĂ©pend de la plateforme (mais est plus que 65534, en gĂ©nĂ©ral 2**31 - 1) - Une restriction sur la compilation des regex entre simples quotes est levĂ©e. Il s'agit de `qr'\N{name}'` qui est n'est plus interdit donc. - Meilleure gestion de la casse avec l'**UTF8** et la langue turque qui est visiblement spĂ©ciale de ce cĂŽtĂ©-lĂ . ### Changements incompatibles #### Mort de certaines variables magiques L'utilisation de ``$*`` et ``$#`` sont interdites : ``$*`` servait Ă  faire du multi line matching. Mais depuis longtemps les modifiers **/m** et **/s** font le mĂȘme job. Quant Ă  ``$#``, il a deux sens : l'un pour formater les nombres (celui-lĂ  est donc interdit maintenant), l'autre pour obtenir le dernier index d'un tableau, comme ceci (celle-lĂ  ne risque pas d'ĂȘtre dĂ©prĂ©ciĂ©e) : ```perl my @a = qw(a b c); print $#a; ``` L'utilisation supprimĂ©e peut ĂȘtre obtenue avec printf ou sprintf et la raison de supprimer cette feature est de *libĂ©rer* **$#** pour un possible nouvel usage. #### Index de dĂ©part des tableaux Comme prĂ©vu, c'est devenu interdit de changer la valeur de `$[`. Pour rĂ©sumer, cette variable qui permet de changer l'index de dĂ©part d'un tableau (dĂ©jĂ  parle en **5.28.0**, [details sur cette variable](https://metacpan.org/pod/perlvar#$%5B)). En fait on peut assigner quelque chose dans `$[` mais _seulement_ la valeur "0"... L'important c'est d'avoir l'impression d’ĂȘtre libre :) #### Autres - Depuis **5.24.0** on avait un warning pour **sysread()**, **syswrite()**, **recv()** et **send()** si on les utilisent avec un filehandle marque **:utf8**. A partir de **5.30.0**, c'est tout simplement fatal ! C'est intĂ©ressant de voir le cycle d'interdiction sur le [ticket](https://rt.perl.org/Public/Bug/Display.html?id=125760) car il y a d'abord eu un warning et ça a laissĂ© du temps pour les modules qui utilisaient cette "misfeature" d'ĂȘtre adaptĂ©s (c'est le cas du module File::Slurp). - On ne peut plus faire de ce genre de dĂ©clarations `my $x if 0`. Mais attention une dĂ©claration comme `my $f = 0; my $x if $f` marche toujours. - Utilisez **CORE::dump()** a la place de **dump()** - Le wrapper **File::Glob::glob()** ne faisait qu'appeler **File::Glob::bsd_glob()** tout en ressemblant a **CORE::glob()**. Pour Ă©viter la confusion, il faut utiliser la fonction wrappĂ©e et non le wrapper. - La fonction **pack** va [croak](https://perldoc.perl.org/Carp.html) (warn and die) plutĂŽt que de gĂ©nĂ©rer de l'UTF8 malformĂ©. - Le comportement par dĂ©faut du core module **JSON::PP** a changĂ© et maintenant [allow_nonref](https://metacpan.org/pod/JSON::PP#allow_nonref) est active. Ce qui est beaucoup plus pratique. ### SecuritĂ© Rien :) ### DĂ©prĂ©ciations L'utilisation de [certaines macros pour gĂ©rer UTF8 dans du code XS](https://metacpan.org/pod/perldeprecation#In-XS-code,-use-of-various-macros-dealing-with-UTF-8.) est reportĂ© Ă  **5.32.0**. ### Performances #### Meilleure transformation UTF-8 vers Unicode code point La transformation de **UTF-8** vers le **code point reprĂ©sentĂ©** (regardez des exemples de correspondances dans [cette table de caractĂšres](https://www.utf8-chartable.de/unicode-utf8-table.pl)) utilise maintenant un automate fini dĂ©terministe. Cela permet un gain de plus de 10 % du nombre d’instructions par traduction. Le mĂȘme genre d’amĂ©lioration est appliquĂ© lors des vĂ©rifications de validitĂ© UTF-8. #### Plus de dĂ©passement de pile sur les fonctions gigantesques Des fonctions trĂšs trĂšs grandes (taille du code dans le corps de la fonction) pouvaient gĂ©nĂ©rer un stack overflow. C'est dĂ» Ă  une rĂ©cursion dans le code qui analyse. Pour donner une idĂ©e de trĂšs trĂšs grand, il s'agit d'un code avec **100000 elsifs**. La rĂ©cursion a Ă©tĂ© supprimĂ©e en **5.30.0**. #### Optimisation sur le character folding Des optimisations des classes de caractĂšres et le *character folding*. C'est quoi le character folding ? Il s'agit, par exemple lors d'une comparaison, de [passer une chaine en minuscule ou d'enlever les accents](https://gregbrown.co/code/haystack-character-folding). #### Autres - Optimisation de la conversion de **IV** vers **UV**. **IV** est une [variable interne Ă  perl pour contenir un pointer](https://perldoc.perl.org/perlguts.html#What-is-an-%22IV%22). **UV** est la mĂȘme chose en unsigned. - Optimisation de la conversion en chaine d'un entier en prenant 2 chiffres Ă  la fois (moins d'instructions). - Le code de perl est passĂ© dans un outil d'analyse ([LGTM](https://lgtm.com/)) et certaines remarques (on peut voir les alertes sur la [page lgtm de perl](https://lgtm.com/projects/g/Perl/perl5/alerts/?mode=tree)) - Optimisation de la regex `qr/[^a]/` et les choses similaires. L'optimisation ne concerne pas toutes les valeurs aprĂšs la nĂ©gation, seules celles en ASCII. Les autres pourraient en bĂ©nĂ©ficier mais demandent trop de spĂ©cialisation du code. ### Mises Ă  jour des modules - MAJ de **File::Find** : la valeur par dĂ©faut de **dont_use_nlink** est **1** soit ne pas faire confiance au filesystem et faire plus de vĂ©rifications pour bien traverser les filesystem. - MAJ **IO::Compress** pour ajouter le support de l'algorithme de compression [Zstandard](https://fr.wikipedia.org/wiki/Zstandard) et [LZMA](https://fr.wikipedia.org/wiki/LZMA) - MAJ de **Math::Bigint** pour modifier **bnok** (binomial coefficient). **Math::Bigint** est un module pour gĂšre les entiers de taille arbitraire dans sans la limitation des 4 bytes. - Moins de warning sur **PerlIO::encoding** sauf si on les demande. - PossibilitĂ© d'ĂȘtre en mode "non-interactif" pour le module **Storable** (qui normalement demande des valeurs limites pour la limite de rĂ©cursion ou l'allocation par exemple) - Toujours **Storable**, dans le cadre du fix de **[CVE-2015-1992]**, un code malicieux mais pas dangereux Ă©tait fourni en test de perl. Comme une sorte de vaccin en fait... Or il Ă©tait reconnu par certains antivirus comme un virus !!! Le code a Ă©tĂ© remplace par un test fonctionnel. - Plus de trace pour **threads::shared**. - Un bugfix sur **use vars**. Une commande dĂ©sactivait une autre. ### Changements internes - Une **passe a Ă©tĂ© supprimĂ©e de l'Ă©valuation des regex par perl**. Il s'agit de la passe de dimensionnement qui sera faite en option si besoin est. - Nouvelle fonction **strtod** dans l'API perl qui correspond Ă  la [fonction c strtod](http://www.cplusplus.com/reference/cstdlib/strtod/). - On ne peut plus allouer plus de mĂ©moire que ce que les structures de donnĂ©es pourront utiliser. - Nouveaux regnodes. - **print_bytes_for_locale()** a prĂ©sent dĂ©fini aussi en debugging mode. ### Compilation et plates‐formes - On peut compiler un code pour ĂȘtre toujours thead-safe avec `-Accflags='-DUSE_THREAD_SAFE_LOCALE'` mĂȘme si perl n'est pas compilĂ© pour ĂȘtre en multi-thread (quelle utilitĂ© ?). - DĂ©finir `-Drv` en plus de `-DDEBUGGING` permet de mettre le mode verbeux pour les regex. - Configure : meilleure dĂ©tection de memrchr, strlcat, strlcpy et memmem. - Des amĂ©liorations concernant **-DPERL_GLOBAL_STRUCT** et un fix sur **-DPERL_GLOBAL_STRUCT_PRIVATE**. - Fix un problĂšme obscur sur **HP-UX 11.11** avec **pack**. - Support **minix 3** remis. - Cygwin ne retourne plus [cuserid](https://linux.die.net/man/3/cuserid). ### Corrections de bogues #### Ouverture filehandles et ulimit -n Fix un bug de leak de file handles, les conditions du bug Ă©tant d'ouvrir de *nombreux rĂ©pertoires* (plus de 1019 environ sous **GNU/Linux**), avec l'option d'*Ă©dition en place*. La valeur magique **1020** est en fait **ulimit -n** moins les file handles dĂ©jĂ  ouverts. Perl ouvrait le rĂ©pertoire mais ouvrait le suivant avant de refermer le dir handle, provoquant le leak. La source du problĂšme vient de la feature de *safe in place editing* introduite en **5.28.0**. Il est d'ailleurs proposĂ© de mettre ce fix dans **5.28.1** ce qui n'est finalement pas fait. #### Réécriture de propriĂ©tĂ©s Unicode en C Réécriture des [propriĂ©tĂ©s unicodes dĂ©finies par l'utilisateur](https://metacpan.org/pod/distribution/perl/pod/perlunicode.pod#User-Defined-Character-Properties). Ça permet d'Ă©crire nos propres tests. La réécriture de pure Perl vers C apporte de nombreux changements : 1. **Mieux intĂ©grĂ©** dans le reste du code, plus d'informations accessibles pour reporter des erreurs. 2. **Plus contraignant** sur le naming de la fonction et son package 3. La **rĂ©cursion est dĂ©tectĂ©e Ă  la compilation** et produit une erreur 4. D'**autres erreurs s'arrĂȘtent** Ă  la compilation. 5. Meilleurs **vĂ©rifications des fourchettes** (fourchettes illĂ©gales) 6. Les propriĂ©tĂ©s sont **compilĂ©es le moins souvent possibl**e (les propriĂ©tĂ©s sont des fonctions Perl, qui sont ensuite exĂ©cutĂ©e dans une regex) 7. **Plus (moins ?) de blocage ou race conditions** #### Corrections de bogues de derniĂšre minute, gel et arbitrage du pumpking Un bug fix de derniĂšre minute sur un panic lorsqu'on fait `sort untrucenUTF8`. [Dans le ticket](https://rt.perl.org/Public/Bug/Display.html?id=134061), les discussions tournent aussi autour du **freeze**, des remerciements Ă  **Sergey Aleynikov** qui a reportĂ© pas mal de bug avec un outil de fuzzing, et un arbitrage de l'actuel possesseur de la citrouille empaillĂ©e (**Sawyer X**). #### Perl ne sait pas garder un secret ;) Des erreurs avec les regex et les modifiers **/di**. C'est quoi **/di** ? - **i** c'est insensible Ă  la casse - **d** c'est pour l'usage interne de Perl La documentation dit _**"ne vous en occupez pas"**_ mais Ă©galement **"(...) _since Perl can't keep a secret, and there may be rare instances where they are useful, they are documented here_ (...)"**. Et donc, comme ce n'est pas un secret ou du moins que Perl ne sait pas le garder... **d** permet de forcer un vieux et problĂ©matique set de caractĂšres de Perl **5.14**. :) #### Autres - Fix compilation avec **-DPERL_MEM_LOG** (log de l'allocation mĂ©moire) et **-DNO_LOCALE** - Petit fix sur l'optimisation du **index** introduit en 5.28.0 (optimisation dans la comparaison avec **-1**). Cette optimisation introduisait un warning quand on utilisait **index** dans un **given/when**. - Fix un warning sur le [constant folding](https://fr.wikipedia.org/wiki/Constant_folding) - Un problĂšme de lexer Ă  cause du **multiconcat** (ajoute rĂ©cemment) - Meilleure output pour **calloc** quand on compile avec **-Dm** pour tracer la mĂ©moire. - **Philippe Hazel** qui est le pĂšre de la bibliothĂšque [PCRE](https://www.pcre.org/) (attention PCRE est une lib autonome qui implĂ©mente les regex *comme Perl* mais qui n'est pas utilisĂ©e par Perl) reporte qu'une nouvelle feature ne semble pas marcher correctement. Il s'agit des **unicode script runs**. **Certaines fourchettes** de valeurs unicodes n'Ă©taient **pas bien gĂ©rĂ©es** dans les regex. - Parfois le *mieux est l'ennemi du bien* :) Sur certaines plateformes, la façon de dĂ©terminer **$\^X** (soit le nom du binaire ayant lance le script) Ă©tait optimisĂ©e. Le problĂšme Ă©tant que lorsque certaines conditions ne permettaient pas de faire cette optimisation (**/proc** pas monte) alors le fallback Ă©tait cassĂ©. RĂ©gression depuis **5.28.0**. - **Meilleure gestion des bases de donnĂ©es corrompues** avec [SDBM_File](https://metacpan.org/pod/SDBM_File). Qu'est-ce que ce module ? Une façon d'ouvrir un base de donnĂ©es et de la *lier* Ă  une variable. De telle sorte que pour ajouter/modifier/supprimer des choses dans la base de donnĂ©es, il suffit de travailler sur le hash et tout sera bien sauvĂ© Ă  la fermeture du programme. L'Ă©change de fichier **SDBM** n'Ă©tait et n'est toujours pas un format d'Ă©change entre plateformes. - On a dĂ©jĂ  parlĂ© de l'**assignement vers une rĂ©fĂ©rence** (feature rĂ©cente). En fait, une expression comme `\@a = ` Ă©tait traitĂ©e implicitement comme `local \@a =`. C'est simplifiĂ©, car le bug n'existe qu'avec les slices. - Fix un problĂšme de reportant d'errno sur **FreeBSD** liĂ© au **realloc**.C'est un cas observable uniquement sur cette plateforme mais pourtant standard au niveau de C. Vu sur **FreeBSD 13.0** - Des problĂšmes de bootstraping liĂ©s au module **Cwd** qui peut maintenant fallback sur certaines fonctions systĂšmes. Ça aide pour les installations multi plateformes (1 perl pour 2 machines ou plus sur le rĂ©seau) - Fix un problĂšme avec le contenu de `$^R`. Pour faire court, cette variable contient le [retour d'une assertion dans une regex](https://metacpan.org/pod/perlvar#$%5ER). - Fix un bug sur le modifier **/g** en regex qui permet de faire un match global c'est Ă  dire que sur un remplacement, le remplacement se fera plusieurs fois s'il faut. C'est un **problĂšme de dĂ©cision dans le dĂ©coupage des chaines**. - Un comportement incohĂ©rent entre `perl -e 'eof() or die' /dev/null` et `perl -e 'eof or die' /dev/null` qui produit `Died at -e line 1.` - Un format syntaxiquement incorrect est maintenant traitĂ© comme une erreur de compilation. - Un bug reportĂ© chez **Red Hat** pour une erreur d’édition en place. L'erreur est dans la gestion des erreurs (die). Le bugfix permet d'Ă©crire le fichier mĂȘme lorsque le script perl est mort avec une exception. - Fix des problĂšmes de comportement dans le cas de compilation avec les flags **-DNO_LOCALE_NUMERIC** et **-DNO_LOCALE_COLLATE** --- # CONCLUSION J'espĂšre que ce grand tour des changements Perl des derniĂšres annĂ©es a Ă©tĂ© intĂ©ressant/utile. C'Ă©tait l'occasion de parler du *vĂ©nĂ©rable Perl* et de redĂ©couvrir Perl dans son Ăšre *post moderne*. ![Perl saves the world](http://imgs.xkcd.com/comics/regular_expressions.png) (d'aprĂšs xkcd [lien](https://imgs.xkcd.com/comics/regular_expressions.png) - Licence CC-BY-NC)

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /