2016-04-03 2 views
0

Я относительно новым для C и у меня есть проблемы со следующим:Regexc - Сегментация 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 

} 

Когда я запускаю это, я получаю segmentation fault.

local был определен как char *local и распечатывается правильно.

Я побежал код, используя GDB и оказывается, что проблема, возникающая на линии:

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

Я не могу показаться, чтобы выяснить, почему.

Это выход из 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 

ли кто-нибудь есть какие-либо идеи относительно того, что может быть проблема?

Благодарим за помощь.

+0

Можете ли вы показать нам определение 'regcomp()' и 'regexec()'? –

+0

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

+0

Вы проверили возвращаемое значение 'reti', чтобы увидеть, что' regcomp' действительно возвращает успешную компиляцию? – Dolda2000

ответ

1

Проблема на самом деле здесь:

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

От here:

Вы должны проверить возвращение regcomp, он скажет вам, что ваше регулярное выражение является недействительным.

Вы получите Invalid preceding regular expression

(?: не поддерживается POSIX регулярных выражений.


Это бросает эту ошибку, потому что:

Обычный способ получить Segfault является разыменовывать нулевой указатель

(От here)

Регулярное выражение не может инициализировать из-за незаконного (?:

Исходная ошибка показана при возврате regcomp и не останавливает выполнение.

+0

И это создает segfault? Предусмотрен ли стандарт POSIX? o.0 – Siguza

+0

@Siguza: он не устраняет ошибку компиляции, а потому, что неинициализированный 'regex_t' передается' regexec'. – Dolda2000

+0

@ Dolda2000 О, черт возьми, я смутил regexec с regcomp в трассировке стека. Теперь это имеет смысл, спасибо. – Siguza

Смежные вопросы