2017-01-09 9 views
-2

Иногда вы не получаете ошибку времени выполнения при доступе к вашему массиву вне диапазона в коде C. таких как:Ошибка сегментации массива C

char array[1024]; 
char* ptr = array; 
*(ptr-10) = 'a'; 

//or 

*(ptr-4096) = 'a'; 

Предполагая, что array находится в стеке, мне любопытно, что МИН РАЗМЕР что позволит *(ptr-SIZE) = 'a' бросить ошибку сегментации в любой ситуации?

, например:

*(ptr-4096*1024) = 'a' // this will always throw a segmentation fault 
*(ptr-4096*8) = 'a' // sometimes this will not throw a segmentation fault 

2017/1/10, новый добавил:

Сочувствую не постановка вопроса ясно. : (

То, что я хочу знать, это не просто неоднозначным UNDEFINED Предполагая, что стек высока, и куча мала Так расположение памяти будет:..

high ********* 
    * stack * <- my array goes here 
    ********* 
    *  * 
    *  * <- ptr may be here 
    *  * 
    ********* 
    * heap * 
    ********* 
    * ??? * <- ptr may be here 
    ********* 

Конечно, я знаю, что

проблема заключается в том, что C/C++ фактически не делать какие-либо границы проверки в отношении массивов. это зависит от операционной системы, чтобы убедиться, что вы получаете доступ действительную память

Итак, приведенный выше код приведет к тому, что ядро ​​ОС вызовет do_page_fault и попытается найти vma с адресом, и проверьте, есть ли vma->vm_start < address.

Теперь, давайте вернемся к вопросу, я спросил: в MIN РАЗМЕР что позволит *(ptr-SIZE) = 'a' бросить ошибку сегментации в любой ситуации. Другими словами, я хочу знать РАЗМЕР, который может позволить себе do_page_fault. Это ничего не касается компилятора C, но как ваша ОС защищает вашу память.

+5

Доступ к массиву за пределами границ [неопределенное поведение] (http://en.cppreference.com/w/cpp/language/ub) – George

+0

Как насчет слова «undefined» как в «неопределенном поведении» неясно? Где вы слышали/читали/.. существует потребность в таком доступе для создания какого-либо конкретного поведения? – Olaf

+0

Вам было бы лучше повторить это как вопрос ОС, «что должен сделать процесс пользовательского пространства, чтобы вызвать ошибку сегментации?» а не то, что, как представляется, является вопросом программирования на новичке C с тех пор, как он ответил. – TrentP

ответ

4

A C совместим со стандартом компилятор оставляет за собой право делать ничего если вы индекс array[i] где i меньше 0 или больше, чем 1023.

поведение в таких случаях говорят, что неопределенными.

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

+2

Обратите внимание, что ссылка в вопросе OP является результатом арифметики указателя, и в этом случае ей _is_ разрешено указывать указатель на 'ptr + 1024', но не на' ptr - 1'. '* (ptr + 1024)', конечно, UB. –

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