2016-03-01 3 views
1

У меня есть некоторые проблемы, чтобы понять порядок выполнения программы на C++. У меня есть программа с bufferoverflow. Но странно то, что segfault (из-за потока bufferoverflow) происходит в коде, некоторые строки перед потоком bufferoverflow.C++ bufferoverflow порядок выполнения

Моя программа выглядит следующим образом:

//Some code ... 
file.seekg(0, std::ios::end); 
auto file_size = file.tellg(); 
file.seekg(0); 

std::vector<uint8_t> buffer(file_size); 

//Some code 
char t[1]; 
t[2] = 1; 

//Some code 

Так аффектации t[2] = 1 генерирует переполнение буфера. Но segfault происходит во время инициализации вектора. file_size хорошо вычисляется, но когда выполняется std::vector<uint8_t> buffer(file_size), file_size становится -1 (генерирует segfault). Этот segfault генерируется потоком bufferoverflow. Если я удалю заявление t[2] = 1, все работает хорошо.

Итак, мой вопрос заключается в том, как segfault может произойти до выполнения bufferoverflow? Исполнение кода может быть изменено компилятором?

+0

't [2] = 1' с размером 1 массив НЕ генерирует переполнение стека. –

+3

't [2] = 1' не собирается переполнять стек. Он перезапишет другой объект, выделенный стекю, который будет переполнением * буфера *, но это не приведет к тому, что сам стек превысит его границы. И если 'file_size' равен -1, когда вы вызываете векторный конструктор, он возвращается как -1 из вызова' tellg'. Поэтому вы должны смотреть на это. – rici

+1

Существует вероятность того, что 'std :: vector' не может выделить элементы' file_size'. –

ответ

3

Так что мой вопрос заключается в том, как segfault может произойти до выполнения bufferoverflow? Исполнение кода может быть изменено компилятором?

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

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

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