ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
53512 Топик полностью
Bill (10.03.2006 15:53, просмотров: 1) ответил FDA на Это я всё понимаю. Просто не ясно - почему компилятор никаких варнингов не выдаёт при явной возможности переполнения стека?
Потому, что компилятор об этом ничего "не знает". Сообщение может выдать линкер, и то в тех случаях, когда общий размер сегментов данных выйдет за пределы адресного пространства памяти. Но это совсем другая история. И не надо забывать, что переполнение стека происходит во время работы программы, а не во время ее трансляции. А во время работы программы, могут возникать прерывания и процедуры обработки прерываний могут потребовать стек дополнительно. А размер стека может определяться как сумма размеров стековой памяти используемой данной функцией и всех вложенных функций. Допустим у Вас проиходит последовательный вызов функций f1()->f2()->f3(), т.е. из f1 вызывается f2, а из f2 вызывается в свою очередь f3. Если для f1 требуется 5 байтов стека, для f2 - 10 и для f3 - 15, то общий требуемый размер стека будет равен 30 байтам. Если допустить, что во время выполнения функции возникнет некоторое прерывания и процедуре его обработки понадобится дополнительно еще 10 байтов стека, то суммарный размер стековой памяти будет рвен 40 байтам. Кстати, в листинге, генерируемом компилятором, размер стека для каждой функции в компилируемом модуле указывается. Т.е. информация к размышлению имеется.