Не удается вывести из строя неисправную логику с помощью моего модульного теста - PullRequest
0 голосов
/ 19 апреля 2019

Итак, я делаю модульное тестирование для моей программы, но есть один случай, когда я знаю, что он должен аварийно завершить работу, но я не могу заставить его это сделать, вот пример моего случая.

#include <stdio.h>

int main(void)
{
    char    buf[2] = { 0 };
    int     i = -1;

    printf("%c", buf[i]);
    return (0);
}

Насколько я понимаю, он должен потерпеть крах в какой-то энтропии, но все, что он, похоже, делает, это считывает, где указатель находится в памяти.Или это поведение должно быть нормальным, и нигде не произойдет сбой, независимо от того, какие тесты мы проводим?

1 Ответ

1 голос
/ 19 апреля 2019

Это поведение должно быть undefined . Это означает, что может произойти сбой, или он может напечатать мусор, или он может ничего не распечатать, потому что компилятору разрешено предполагать, что не определено поведение, и не генерировать какой-либо код, ведущий к нему ... или он может убить вас (буквально ) если он найдет свой путь в производственный код критически важного приложения.

Если вы действительно хотите протестировать его, вам нужно полагаться на знание поведения вашего компилятора и на приемы, определяемые реализацией для вашей конкретной платформы, например, в Linux с поддержкой MMU, выравнивая buf в начале страницы памяти и пометив предыдущую страницу памяти как mprotect(PROT_NONE) - тогда вы получите SIGSEGV при попытке доступа к ней.

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