2017-08-28 1 views
1

Für den Befehl zu segfault muss er in einem Verzeichnis mit Dateien ausgeführt werden, die Text enthalten. Ohne die oder Gruppe wird nicht seg-fault.Warum ist der folgende Befehl grep segfault: grep -Pz "(. | N) *" *

+0

Wie die man-Seite sagt, 'Grep -P ist" sehr experimentell "so YMMV und Verwendung auf eigene Gefahr.Ich persönlich würde es wie die Pest vermeiden, die von den Autoren eine deutliche Warnung erhalten hat, aber ich sehe andere Leute, die es befürworten ... –

+0

Versuchen Sie, eine Periode oder "irgendein Zeichen außer Zeilenabschluss" zu finden? Meine Annahme ist, dass Sie versuchen, auf einen Punkt am Ende eines Satzes oder einen Zeilenumbruch abzustimmen. In Ihrem Beispiel Regex wird der Punkt im Grunde alles zusammenpassen, wobei Sie, um den Punkt als Text anzupassen, mit einem umgekehrten Schrägstrich davon abkommen müssen. – user3661841

+0

Vielleicht ist Ihr _grep_ wirklich ein Virus. – sln

Antwort

0

Warum wird der folgende Befehl grep segfault

Da ein Fehler in es da ist.

Jeder Absturz in Benutzern Dienstprogramme wie grep, cp, ls usw. ist ein Fehler in dem Dienstprogramm, und Sie sollen es mit einem Satz von minimalen Schritten berichten erforderlich, um es zu reproduzieren.

0

Es scheint ähnlich zu einem anderen Fehler: "git grep" kompiliert mit libpcre2 manchmal einen segfault ausgelöst.
Und mit Git 2.16 (Q1 2018) wird dies behoben.

Siehe commit a25b908, commit ce9a257 (23 Nov. 2017) von Ævar Arnfjörð Bjarmason (avar).
(Verschmelzung durch Junio C Hamano -- gitster -- in commit b3f04e5 13 Dez 2017)

grep: fix segfault unter -P + PCRE2 <=10.30 + (*NO_JIT)

einen Fehler bei der Erstellung von PCRE2 Mustern unter JIT-Fix (die häufigste Laufzeitkonfiguration). Jedes Muster mit einem (*NO_JIT) Verb würde segfault in jedem aktuell freigegebenen PCRE2 Version:

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

Dass dies segfaulted war ein Bug in PCRE2 selbst, nachdem er die Berichterstattung ("How am I supposed to use PCRE2 JIT in the face of (*NO_JIT) ?") auf pcre-dev, es hat sich in einem noch festgelegt zu veröffentlichende Version von PCRE (vermutlich zuerst als 10.31 veröffentlicht).
Jetzt wird es sterben mit:

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

Aber die Ursache des Fehlers ist in unserem eigenen Code aus dem Jahr meine 94da919 (“grep: die Unterstützung für PCRE v2" , 2017.06.01, Git 2.14-rc0).

Wie in dem Kommentar zu mehr Länge hier hinzugefügt wird, ist es nicht ausreichen, um nur pcre2_config() zu überprüfen, um zu sehen, ob der JIT sollte verwendet werden, pcre2_pattern_info() hat auch gefragt werden.

Das ist etwas, was ich selbst entdeckt habe, als ich mit PCRE2 Verben in Patterns experimentierte, die an Git übergeben wurden. Ich erwarte nicht, dass irgendein Benutzer von git diesem die Unklarheit der Übergabe von PCRE2-Verben durch die Bibliothek begegnet, zusammen mit der relativen Dunkelheit von (* NO_JIT) selbst.

Auch das könnte nicht genau der gleiche Fehler sein, aber Sie könnten Ihre git grep wieder betrachten testen einmal Git 2,16 Release, um zu sehen, ob das Problem weiterhin besteht.