Стандарт C определяет поведение переполнения стека?

может быть это hostsFile 'nil ??

func main() {
    ansInstance := NewAnsInstance("name", "url", "path")

    // add code and check hostsFile
    fmt.Printf("%+v\n", ansInstance)
}
5
задан GEOCHET 1 April 2009 в 17:57
поделиться

8 ответов

Стандарт не требует использования стека и не имеет ничего для высказывания о переполнениях стека.

14
ответ дан 18 December 2019 в 05:27
поделиться

Стандарт C даже не определяет стек, таким образом, он, конечно, не определяет то, что происходит когда переполнения стека.

4
ответ дан 18 December 2019 в 05:27
поделиться

Стандарт C99 не определяет стек; это только обсуждает автоматическое или выделенное устройство хранения данных в кратком обзоре, тогда как непрерывный стек с водосливным обнаружением является только одним механизмом для реализации автоматического хранения.

Раздел 7.14 из стандарта определяют SIGSEGV как сигнал, который происходит на "недопустимом доступе к устройству хранения данных". Реализации C не требуются, чтобы генерировать любые сигналы, но реализации с помощью непрерывной стопки фиксированного размера* обычно сигнализируют о SIGSEGV, если переполнение стека обнаруживается.

Можно зарегистрировать функцию-обработчик сигнала для SIGSEGV, но он не может возвратиться -" [я] f и когда функция возвращается, если значение сигнала является SIGFPE, SIGILL, SIGSEGV или каким-либо другим определенным реализацией значением, соответствующим вычислительному исключению, behavio [u] r не определен".

(* не, что я сознательно работал с реализациями C, которые не делают, но я ни о чем не знаю в стандарте C, предотвращающем использование общих методов, используемых для реализации growable доменов автоматического хранения в других средах),

8
ответ дан 18 December 2019 в 05:27
поделиться

Согласно некоторым ответам на этот вопрос, стандарты C даже не имеют ничего для высказывания о существовании стека, уже не говоря о переполнении стека.

2
ответ дан 18 December 2019 в 05:27
поделиться

Ответы здесь корректны в заявлении, что это не имеет отношения к c стандарту, но Ваш оператор, что "Кроме завершения процесса, не кажется, что существует много, который может быть сделан", не - как общность - верен.

На самом деле, в большинстве систем с управлением виртуальной памятью и по требованию подкачкой страниц, выделенный стек является довольно маленьким (обычно на 4 КБ больше, чем в настоящее время используется), и часто переполняется (который генерирует прерывание по отсутствию страницы), и ОС просто добавляет другую страницу памяти к стеку для потока.

Предел стека - обычно - 1 МБ, является просто довольно произвольным числом, выбранным для принятия мер против безудержных программ, и обычно не является абсолютным пределом (хотя это был на некоторых моделях памяти с процессорами Intel IIRC). Обычно не имело бы смысла выделять 1 МБ физической памяти к каждому потоку.

4
ответ дан 18 December 2019 в 05:27
поделиться

Я абсолютно уверен специфические особенности того, что происходит, определяются операционной системой однако, во всех случаях, программа должна выйти. Вы корректны в предположении, что нет действительно ничего, что можно сделать, после того как переполнение стека происходит (по крайней мере, как программист). Все, что можно действительно сделать, предотвращают их во-первых.

1
ответ дан 18 December 2019 в 05:27
поделиться

Это до операционной системы. Много операционных систем позволяют размеру стека по умолчанию быть перезаписанным, все же. Например, в Windows, можно использовать этот флаг компоновщика для увеличения размера стека от 1 МБ до более высокого значения.

1
ответ дан 18 December 2019 в 05:27
поделиться

Как другие люди упомянули, в стандарте ничто не говорится о стеке.

Но, я думаю это, это должно было определить поведение переполнения стека, в стандарте будет сказано, что это приводит к неопределенному поведению.

:: rimshot::

1
ответ дан 18 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: