2016-04-03 13 views
0

Ich bin relativ neu in C und ich habe ein Problem mit dem folgenden:Regexc - Segmentation Fault

regex_t re; 
regmatch_t matches[2]; 
int start; 
int end; 
int count = 0; 

int reti = regcomp(&re, "^(?:[a-zA-Z]|[a-zA-Z](?:[a-zA-Z0-9\\-])*[a-zA-Z0-9])(?:\\.(?:[a-zA-Z]|[a-zA-Z](?:[a-zA-Z0-9\\-])*[a-zA-Z0-9]))*$", REG_EXTENDED); 

while (1) { 

    printf("Local = %s\n", local); 
    reti = regexec(&re, local, 2, matches, 0); 

    // More code here 

} 

Als ich das laufen, erhalte ich eine segmentation fault.

local wurde als char *local definiert und wird korrekt ausgedruckt.

lief ich den Code mit GDB und es stellt sich heraus, das Problem bei der Leitung entstehen:

reti = regexec(&re, local, 2, matches, 0); 

Ich kann nicht, warum scheinen, um herauszufinden.

Dies ist die Ausgabe von gdb:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7af8d42 in regexec() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) backtrace 
#0 0x00007ffff7af8d42 in regexec() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x000000000040092d in email_in (str=0x400aa8 "[email protected]") attestdriver.c:70 
#2 0x0000000000400780 in main() at testdriver.c:15 

Würde jemand eine Idee, was das Problem sein könnte?

Danke für Ihre Hilfe.

+0

Können Sie uns die Definition von 'regcomp()' und 'regexec()' zeigen? –

+0

@sunqingyao https://github.com/lattera/glibc/blob/master/posix/regcomp.c#L465-L519 – Siguza

+0

Haben Sie Ihren 'reti' Rückgabewert überprüft, um zu sehen, dass' regcomp' tatsächlich eine erfolgreiche Kompilierung zurückgibt? – Dolda2000

Antwort

1

Das Problem eigentlich hier ist:

int reti = regcomp(&re, "^(?:[a............ 

Von here:

Sie benötigen die Rückkehr von regcomp zu überprüfen, wird es Ihnen sagen, dass Ihre Regex ungültig ist.

Sie werden Invalid preceding regular expression erhalten

(?: nicht von POSIX reguläre Ausdrücke unterstützt wird.


Es diesen Fehler ist zu werfen, weil:

Ein üblicher Weg, eine segfault bekommen zu dereferenzieren einen Null-Zeiger ist

(Von here)

Die Regex nicht initialisiert werden kann wegen der illegalen (?:

Der ursprüngliche Fehler wird in der Rückgabe von regcomp angezeigt und beendet die Ausführung nicht.

+0

Und das erzeugt einen segfault? Ermöglicht der POSIX-Standard das? o.0 – Siguza

+0

@Siguza: Es wird nicht auf den Kompilierungsfehler segfault, sondern weil ein nicht initialisiertes 'regex_t' an 'regexec' übergeben wird. – Dolda2000

+0

@ Dolda2000 Oh verdammt, ich verwechselt Regexec mit Regcomp in der Stack-Trace. Es macht jetzt Sinn, danke. – Siguza