Ошибка сегментации при использовании afl fuzzer - PullRequest
1 голос
/ 09 января 2020

У меня проблема с выяснением, что не так с моим кодом ниже. Я запускаю полный код и провожу много входного тестирования, и ошибки обрабатываются так, как я хочу. Я также использую такие вещи, как valgrind, cppchecker для проверки ошибок, которые я исправил. Затем я решил использовать afl-fuzzer для расширенного обнаружения ошибок в моих кодах, а затем я получаю много сбоев из-за строки кода ниже. Тем не менее, большинство сбоев происходит из-за ошибки сегментации. но я не вижу, что не так с кодом. Любая помощь будет оценена. Ниже приведена функция, которая продолжает выдавать ошибку. Что, я думаю, имеет отношение к sscanf:

Tree* insert(char* command, Tree* tree) {
    int age;
    char* name = malloc(sizeof(char) * 20);

    if (2 != sscanf(command, "i %d %20s", &age, name)){
        fprintf(stderr, "Failed to parse insert command: not enough parameters filled\n");
       // return NULL;
    }

    if (tree == NULL){
        tree = tree_create();
    }

    tree_insert(tree, age, name);

    return tree;
}

tree_create function

Tree* tree_create(){
Tree *tree = malloc(sizeof(Tree));
tree->root = NULL;

return tree;
}

tree_insert

void tree_insert(Tree* tree, int age, char* name) {
if (tree->root == NULL) {
    Node *node = calloc(1, sizeof(Node));
    node->name = name;
    node->age = age;
    node->isRoot = true;
    node->right = NULL;
    node->left = NULL;
    tree->root = node;

} else {
    node_insert(tree->root, age, name, 1);
}
}

1 Ответ

4 голосов
/ 09 января 2020

Основная проблема заключается в строках:

char* name = malloc(sizeof(char) * 20);

if (2 != sscanf(command, "i %d %20s", &age, name)){

Ваша спецификация преобразования %20s говорит, что sscanf() может хранить 20 символов плюс нулевой байт в name, но вы только выделяете достаточно места для 19 символов плюс нулевой байт. Это «одно за другим» между семейством функций scanf() и большинством других функций вызывает проблемы, и фаззеры должны их найти.

Исправление простое: либо изменить первые 20 на 21 или поменяйте вторые на 20 на 19. Что лучше, так это ваше решение. У нас недостаточно информации, чтобы выбрать, какой из них лучше, если он есть.

...