2015-07-15 3 views
0

Я пытаюсь имитировать неопределенное поведение неопределенного указателя. Какие изменения должны быть внесены в приведенном ниже коде, чтобы ввести неопределенное поведение неопределенного указателя., имитирующий неопределенное поведение Null Pointer в C

void foo(int * d) 
{ 
    printf("hello\n"); 
} 

int main(void) 
{ 
    int a = 7 ; 
    int *b = malloc(sizeof(int)) ; 
    foo(b) ; 
} 
+1

возможно дубликат [указатель Understanding NULL в C] (http://stackoverflow.com/questions/29379663/understanding-null-pointer-in-c) – kittykittybangbang

+0

он объяснил исключение нулевого указателя, , но я хотел бы знать, как ввести здесь исключение нулевого указателя. Вы можете удалить флаг дубликата – Madara

+1

В C нет исключений, поэтому исключение-указатель 'NULL' не может быть в C. –

ответ

2

на основе кода, мы можем имитировать Null Pointer UB, как это,

#include<stdio.h> 
void foo(int * d) 
{ 
    printf("hello, it is %d\n", *d);//dereference d (produces "Segmentation fault" if d is NULL) 
} 

int main(void) 
{ 
    int a = 7 ; 
    int *b = NULL; // simulate failed to malloc(sizeof(int)) 

    foo(&a); // output is "hello, it is 7" 
    foo(b); // will trigger something like "Segmentation fault" 
} 

Как указываемой @Basile Starynkevitch, исключений нет в C, поэтому здесь было бы точнее сказать «NULL pointer UB (Undefined Behavior)» по сравнению с «NULL-указателем исключения».

+0

Thanks Eric Tsui – Madara

+0

Неправильно. Здесь нет исключения, просто какое-то неопределенное поведение ** –

+0

@BasileStarynkevitch Согласен. Потому что вопрос отмечен как тэг 'c', а 'c' - без исключения. Таким образом, я предположил, что владелец вопроса означает «исключение нулевого указателя» - это некоторое «ненормальное поведение», вызванное указателем NULL, то есть UB. В любом случае, вы правы. Это неопределенное поведение. –

1

Вот как разыменования нулевого указателя:

int *b = 0; 
*b = 3; 
+0

Привет, приятель, пожалуйста, пожалуйста, что именно вы делаете? – Madara

+0

Нет со стандартной точкой С. Это неопределенное поведение. –

3

разыменовывая NULL указатель (или какой-либо адрес за пределами текущего address space, часто в virtual memory) в C являетсяне в exception, но некоторые undefined behavior (часто segmentation fault). Вам really следует избегать UB.

По определению неопределенного поведения мы не можем объяснить это, не сводясь к очень конкретным деталям реализации (компилятор, время выполнения, оптимизация, ASLR, машинный код, фаза луны, ...).

malloc библиотека функция может (и.) Не работает. Вы всегда должны проверить его, по крайней мере, как:

int *b = malloc(sizeof(int)); 
if (!b) { perror("malloc of int"); exit(EXIT_FAILURE); }; 

Чтобы вызвать отказ malloc (но очень часто первые несколько звонков в malloc все равно получится) можно опустить доступное адресное пространство для вашей программы. В Linux используйте ulimit в родительской оболочке или вызовите setrlimit(2).

Кстати, вы могли бы даже связать с вашим собственным malloc, который всегда неисправный:

// a silly, standard conforming, malloc which always fail: 
    void* malloc(size_t sz) { 
    if (sz == 0) return NULL; 
    errno = ENOMEM; 
    return NULL; 
    } 

Язык программированияC не имеет исключений. C++ (и Ocaml, Java, ....) делает (с catch & throw заявлениями). Поднятие исключения - это нелокальное изменение потока управления. В стандарте C для этой цели вы можете использовать longjmp. В C++ разыменовании nullptr является UB (и не вызывает никакого исключения-указателя, которое не существует в C++).

+0

Thanks mr. Базиле, обновил вопрос в соответствии с вашим предложением – Madara

Смежные вопросы