Я новичок в C ++, и я играл с string
учебный класс. Я понял, когда я запускаю следующий код в CodeBlocks с компилятором GNU:
#include <iostream>
using namespace std;
int main()
{
string test = "hi";
cout<<"char is : "<<test[100];
return 0;
}
Я на самом деле получить значение. Я играю с индексами (я пробовал от 100 до 10000), и я могу получить других персонажей, или я могу получить ноль. Означает ли это, что вы можете читать части памяти, которые вам не нужны? вы можете использовать его для эксплуатации? или это просто мой разум иллюзорен?
Это неопределенное поведение, поэтому может случиться что угодно. Компилятор может оптимизировать строку, вставить abort () или сделать что-нибудь еще.
Если компилятор не вносит больших изменений в код, и std::string
реализует оптимизацию коротких строк, затем test[100]
получит доступ к кадру стека одной из функций, вызывающих main()
,
Эти функции отвечают за загрузку разделяемых библиотек, организацию переменных среды, создание глобальных объектов, таких как std::cout
и создание и передача argc, argv, в main()
, Этот код заглядывает в стек этих функций. В системе с защитой памяти, такой как Linux или Windows, с достаточно удаленным доступом, приложение будет аварийно завершено.
Не надейтесь на это, так как компилятор может сделать с этим что-то совершенно неожиданное.
И да, это может привести к эксплуатации. Если вне границ зависит от ввода пользователя, то этот пользователь может иметь возможность читать или записывать данные, которые он не должен был. Это один из способов распространения червя или вируса: они читают пароли или пишут код, который будет выполняться после возврата из функции.
Ответ прост — неопределенное поведение. Нет, вы не можете доверять этой информации, и это настоятельно не рекомендуется. Не делай этого ..