#c
#c
Вопрос:
Итак, я провожу модульный тест для своей программы, но есть один случай, когда я знаю, что он должен завершиться сбоем, но, похоже, я не могу этого сделать, вот пример случая, который у меня есть.
#include <stdio.h>
int main(void)
{
char buf[2] = { 0 };
int i = -1;
printf("%c", buf[i]);
return (0);
}
Насколько я понимаю, он должен привести к сбою в какой-то энтропии, но все, что он, похоже, делает, это считывает, откуда указатель находится в памяти. Или это поведение должно быть нормальным, и нет никакого способа, при котором оно могло бы привести к сбою, независимо от того, какие тесты мы запускаем?
Комментарии:
1. Вы не можете проверить неопределенное поведение, потому что то, что должно произойти, не определено . Кстати, это совсем не похоже на модульный тест.
2. Предполагалось, что это всего лишь пример, а не фактический фрагмент кода и модульный тест; Это было просто ради минимализма, но я понимаю, что вы имеете в виду. Спасибо.
3. Да, пример кода должен быть минимальным, но он также должен быть полным. Вы должны опубликовать фактический код модульного теста.
Ответ №1:
Предполагается, что это поведение не определено. Это означает, что он может произойти сбой, или он может печатать мусор, или он ничего не может печатать, потому что компилятору разрешено предполагать, что неопределенное поведение не происходит, и не генерировать какой-либо код, ведущий к нему … или он может убить вас (буквально), если он попадет в производственный код безопасности -критическое приложение.
Если вы действительно хотите проверить это, вам нужно полагаться на знание поведения вашего компилятора и на определенные реализацией приемы для вашей конкретной платформы, такие как, в Linux с поддержкой MMU, выравнивание buf
по началу страницы памяти и пометка предыдущей страницы памяти как mprotect(PROT_NONE)
— тогда вы будетеполучить SIGSEGV
при попытке получить к нему доступ.