Пример переполнения стека на C++ | OTUS
OTUS исполняется 3 года!
Скидки до 30% в честь дня рождения! Успейте купить курс по выгодной цене ➞
Выбрать курс

Курсы

Программирование
MS SQL Server разработчик AWS для разработчиков CI/CD на AWS, Azure и Gitlab Архитектура и шаблоны проектирования
-20%
Разработчик C++
-20%
Разработчик Java
-20%
React.js разработчик
-20%
Backend-разработчик на PHP
-30%
Алгоритмы для разработчиков
-30%
Agile Project Manager в IT
-30%
iOS Разработчик. Продвинутый курс v 2.0.
-10%
Разработчик Python
-30%
PostgreSQL
-10%
Разработчик игр на Unity
-15%
VOIP инженер
-30%
Web-разработчик на Python Cloud Solution Architecture
Специализации Курсы в разработке Подготовительные курсы
+7 499 110-61-65

Пример переполнения стека на C++

Cplus_Deep_21.1-5020-7b5678.png

Представьте, что у вас есть кусочек кода следующего содержания:

operator int() const {
    return *this;
}

Всё бы ничего, но тут имеется некоторая проблема. Что не так, спросите вы? Чтобы ответить на этот вопрос, посмотрим на полный код:

class Foo {
public:
    operator int() const {
        return *this;
    }
};

int main() {
    Foo foo;
    int i = foo;
    return 0;
}

Этот код без проблем скомпилируется, хотя ряд компиляторов может сказать warning. Но когда вы этот код запустите, вы столкнётесь с переполнением стека, словив stack overflow.

В чём же дело?

Оказывается, что в нашем коде operator int старается привести возвращаемое значение к типу int. И это можно сделать, ведь для текущего объекта мы имеем прекрасный operator int, который, собственно говоря, это и делает.

Таким образом, функция вызывает сама себя и продолжает это делать рекурсивно, то есть до тех пор, пока стек не переполнится.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🔥 Скидки до 50% на новые супер-интенсивы!
«Тестирование игр», «Data Engineer», «работа с протоколом BGP». Узнайте подробности в чате ➞