2017-08-28 4 views
1

Pour la commande de segfault, elle doit être exécutée dans un répertoire contenant des fichiers contenant du texte. Sans le ou le groupe, il ne se sépare pas.Pourquoi la commande grep suivante segfault: grep -Pz "(. | N) *" *

+0

Comme le dit la page de manuel, 'grep -P' est" hautement expérimental "donc YMMV et l'utilise à vos risques et périls.Personnellement, je l'éviterais comme la peste étant donné cet avertissement clair des auteurs mais je vois que d'autres personnes le préconisent ... –

+0

Essayez-vous de faire correspondre sur la période ou "tout caractère, mais les terminateurs de ligne"? Mon hypothèse est que vous essayez de faire correspondre sur une période à la fin d'une phrase OU un retour à la ligne. Dans votre exemple regex, la période correspond à peu près à tout, où comme pour correspondre à la période en tant que texte, vous devrez l'échapper avec une barre oblique inverse. – user3661841

+0

Peut-être que votre _grep_ est vraiment un virus. – sln

Répondre

0

Pourquoi la commande grep suivante Segfault

Parce qu'il ya un bogue.

Tout accident dans les services publics de l'utilisateur, tels que grep, cp, ls, etc. est un bug dans ledit utilitaire, et vous devez le signaler avec un ensemble de mesures minimales requises pour le reproduire.

0

Il semble similaire à un autre bogue: "git grep" compilé avec libpcre2 a parfois déclenché un segfault.
Et avec Git 2.16 (Q1 2018), ceci est en cours de correction.

Voir commit a25b908, commit ce9a257 (23 nov 2017) par Ævar Arnfjörð Bjarmason (avar).
(Fusionné par Junio C Hamano -- gitster -- en commit b3f04e5 13 Déc 2017)

grep: fixer segfault sous -P + PCRE2 <=10.30 + (*NO_JIT)

Correction d'un bug dans la compilation des modèles PCRE2 sous JIT (configuration du runtime le plus courant). Tout modèle avec un verbe (*NO_JIT) serait segfault dans une version PCRE2 actuellement publiée:

$ git grep -P '(*NO_JIT)hi.*there' 
    Segmentation fault 

Que ce crashait était un bogue dans PCRE2 lui-même, après l'avoir signalé (« How am I supposed to use PCRE2 JIT in the face of (*NO_JIT) ? ») sur pcre-dev, il a été fixé dans un encore version à venir de PCRE (vraisemblablement publié d'abord sous le nom de 10.31).
Maintenant, il va mourir avec:

$ git grep -P '(*NO_JIT)hi.*there' 
    fatal: pcre2_jit_match failed with error code -45: bad JIT option 

Mais la cause du bug est dans notre propre code datant de mon 94da919grep: ajouter le support pour PCRE v2" , 01/06/2017, Git 2.14-rc0).

Comme expliqué plus longuement dans le commentaire étant ajouté ici, ce n'est pas suffisant pour il suffit de cocher pcre2_config() pour voir si le JIT doit être utilisé, pcre2_pattern_info() doit également être demandé.

C'est quelque chose que je me suis découvert en tripotant des verbes PCRE2 dans des patterns passés à git. Je ne m'attends pas à ce que n'importe quel utilisateur de git ait rencontré cela étant donné l'obscurité de passer les verbes PCRE2 à la bibliothèque, avec l'obscurité relative de (* NO_JIT) lui-même.

Encore une fois, cela pourrait ne pas être exactement le même bug, mais vous pourriez envisager de tester votre git grep une nouvelle fois Git 2.16 est sortie, pour voir si le problème persiste.