У меня есть некоторые проблемы, чтобы понять порядок выполнения программы на 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? Исполнение кода может быть изменено компилятором?
't [2] = 1' с размером 1 массив НЕ генерирует переполнение стека. –
't [2] = 1' не собирается переполнять стек. Он перезапишет другой объект, выделенный стекю, который будет переполнением * буфера *, но это не приведет к тому, что сам стек превысит его границы. И если 'file_size' равен -1, когда вы вызываете векторный конструктор, он возвращается как -1 из вызова' tellg'. Поэтому вы должны смотреть на это. – rici
Существует вероятность того, что 'std :: vector' не может выделить элементы' file_size'. –