Это однопоточный код.
В частности: модуль расширения ahocorasick Python (easy_install ahocorasick).
Я выделил проблему на тривиальный пример:
import ahocorasick
t = ahocorasick.KeywordTree()
t.add("a")
Когда я запускаю его в gdb, все в порядке, то же самое происходит, когда я ввожу эти инструкции в Python CLI. Однако, когда я пытаюсь запустить скрипт регулярно, у меня возникает ошибка.
Чтобы сделать это еще более странным, строка, вызывающая segfault (идентифицированная анализом дампа ядра), представляет собой обычное увеличение int (см. Нижнюю часть тела функции).
Я полностью застрял к этому моменту, что я могу сделать?
int
aho_corasick_addstring(aho_corasick_t *in, unsigned char *string, size_t n)
{
aho_corasick_t* g = in;
aho_corasick_state_t *state,*s = NULL;
int j = 0;
state = g->zerostate;
// As long as we have transitions follow them
while( j != n &&
(s = aho_corasick_goto_get(state,*(string+j))) != FAIL )
{
state = s;
++j;
}
if ( j == n ) {
/* dyoo: added so that if a keyword ends up in a prefix
of another, we still mark that as a match.*/
aho_corasick_output(s) = j;
return 0;
}
while( j != n )
{
// Create new state
if ( (s = xalloc(sizeof(aho_corasick_state_t))) == NULL )
return -1;
s->id = g->newstate++;
debug(printf("allocating state %d\n", s->id)); /* debug */
s->depth = state->depth + 1;
/* FIXME: check the error return value of
aho_corasick_goto_initialize. */
aho_corasick_goto_initialize(s);
// Create transition
aho_corasick_goto_set(state,*(string+j), s);
debug(printf("%u -> %c -> %u\n",state->id,*(string+j),s->id));
state = s;
aho_corasick_output(s) = 0;
aho_corasick_fail(s) = NULL;
++j; // <--- HERE!
}
aho_corasick_output(s) = n;
return 0;
}