c ++ — успешно распечатывает строковые индексы диапазона

Я новичок в C ++, и я играл с string учебный класс. Я понял, когда я запускаю следующий код в CodeBlocks с компилятором GNU:

#include <iostream>

using namespace std;

int main()
{
string test = "hi";
cout<<"char is : "<<test[100];
return 0;
}

Я на самом деле получить значение. Я играю с индексами (я пробовал от 100 до 10000), и я могу получить других персонажей, или я могу получить ноль. Означает ли это, что вы можете читать части памяти, которые вам не нужны? вы можете использовать его для эксплуатации? или это просто мой разум иллюзорен?

0

Решение

Это неопределенное поведение, поэтому может случиться что угодно. Компилятор может оптимизировать строку, вставить abort () или сделать что-нибудь еще.

Если компилятор не вносит больших изменений в код, и std::string реализует оптимизацию коротких строк, затем test[100] получит доступ к кадру стека одной из функций, вызывающих main(),

Эти функции отвечают за загрузку разделяемых библиотек, организацию переменных среды, создание глобальных объектов, таких как std::coutи создание и передача argc, argv, в main(), Этот код заглядывает в стек этих функций. В системе с защитой памяти, такой как Linux или Windows, с достаточно удаленным доступом, приложение будет аварийно завершено.

Не надейтесь на это, так как компилятор может сделать с этим что-то совершенно неожиданное.

И да, это может привести к эксплуатации. Если вне границ зависит от ввода пользователя, то этот пользователь может иметь возможность читать или записывать данные, которые он не должен был. Это один из способов распространения червя или вируса: они читают пароли или пишут код, который будет выполняться после возврата из функции.

0

Другие решения

Ответ прост — неопределенное поведение. Нет, вы не можете доверять этой информации, и это настоятельно не рекомендуется. Не делай этого ..

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector