C regexec segfault - PullRequest
       10

C regexec segfault

0 голосов
/ 16 апреля 2011

Это моя первая настоящая попытка с C и регулярным выражением, так что терпите меня ... У меня есть массив шаблонов (shortener_patterns), в котором я перехожу к compile_patterns вместе с счетчиком и массивом для скомпилированных шаблонов (shortener_r_patterns). Я могу скомпилировать шаблоны, но код будет зависать на regexec. Я предполагаю, что это как-то связано с тем, как я ссылаюсь на shortener_r_patterns, и с моим отсутствием полного понимания указателей. Или, возможно, они не компилируются должным образом. Кто-нибудь может заставить меня двигаться в правильном направлении?

char **shortener_patterns = '\0';

regex_t **shortener_r_patterns;

int *shortener_count = 0;


int compile_patterns(char **patterns, regex_t **r_patterns, int *count, int *compiled_count) {
    static int i;

    if (!(r_patterns = calloc(count, sizeof(regex_t)))) {
        return -1;
    }

    for (i=0; i<count; i++) {
        log(5, "compiling pattern %i: %s\n", i, patterns[i]);

        if (regcomp(&(r_patterns[i]), patterns[i], REG_EXTENDED|REG_NEWLINE|REG_ICASE|REG_NOSUB) != 0) {
            log(1, "invalid pattern: %s\n", patterns[i]);
            return -1;
        }
        // increment the compiled count
        (*compiled_count)++;
    }
    log(3, "finished compiling %i\n", count);

    return 0;
}

int check_shortener(char *domain) {
    static int i;

    if (!shortener_count) {
        return 0;
    }

    for (i=0; i<shortener_count; i++) {
        log(5, "checking shortner pattern '%s' against %s:%d\n", shortener_patterns[i], domain, i);
        if (regexec(&(shortener_r_patterns[i]), domain, 0, 0, 0) == 0) {
            log(1, "pattern %i '%s' found in %s\n", i, shortener_patterns[i], domain);
            return 1;
        }
    }
    return 0;
}

Здесь я сканирую файл, чтобы получить содержимое для своих шаблонов, добавляю их в массив и, наконец, компилирую массив шаблонов.

- snip -

   while ((rc = fscanf(f, "%254[^\n]", buf)) > 0) {
        if (buf[0] == '#') {
            fscanf(f, "\n");
            continue;
        }
        newshortener = realloc(shortener_patterns, sizeof(char *) *(count+1));
        if (newshortener) {
            shortener_patterns = newshortener;
        }
        else {
            log(0, "could not realloc memory for shortener patterns\n");
            fclose(f);
            return -1;
        }
        shortener_patterns[count++] = strdup(buf);
        fscanf(f, "\n");
    }
    fclose(f);
    if (compile_patterns(shortener_patterns, shortener_r_patterns, count, &shortener_count) > 0) {
        log(0, "Failed to compile %s patterns\n", sfile);
    }

- snip -

1 Ответ

1 голос
/ 09 мая 2011

shortener_count не имеет пробела, вы определили его как int *, затем установите указатель на 0, а затем получите доступ к указателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...