GCC и реентерабельный код
Генерирует ли GCC реентерабельный код для всех сценариев?
5 ответов
Реентранс это то, на что ISO C и C++ способны по своему замыслу, включая GCC. Вы по-прежнему несете ответственность за кодирование функции для повторного входа.
Компилятор A C, который не генерирует код повторного входа, даже когда функция закодирована правильно для повторного входа, будет скорее исключением, чем правилом, и будет по причинам архитектурного ограничения (например, из-за недостатка ресурсов для поддержки стека, поэтому генерируются статические кадры). В этих ситуациях документация компилятора должна прояснить это.
Некоторые статьи, которые вы можете прочитать:
Нет, GCC не гарантирует написанного вами кода. Вот хорошая ссылка для написания реентерабельного кода.
GCC генерирует реентерабельный код, по крайней мере, на большинстве платформ, для которых он компилируется (особенно если вы избегаете передачи или возврата структур по значению), но вполне возможно, что конкретный язык или платформа ABI могут диктовать иное. Вам нужно быть более конкретным, чтобы сделать более убедительное заявление; Я знаю, что он, безусловно, в основном возвращается на процессоры для настольных компьютеров, если компилируемый код сам по себе в основном реентерабелен (странные трюки с глобальным состоянием, конечно, могут вызвать проблемы на любой платформе).
Повторный вход не является чем-то, что компилятор может контролировать, это зависит от программиста, чтобы написать повторно входящий код. Для этого вам нужно избегать всех очевидных ловушек, например, глобальных (включая локальные статические переменные), общих ресурсов, потоков, вызовов других не реентерабельных функций и т. Д.
Сказав это, некоторые кросс-компиляторы для небольших встроенных систем, например, 8051, могут не генерировать реентерабельный код по умолчанию, и вам, возможно, придется запросить реентерабельный код для конкретных функций, например, с помощью #pragma
,
Нет, GCC не может гарантировать повторный ввод кода, который вы пишете.
Однако на основных платформах код, созданный или включенный компилятором, такой как встроенные математические функции или вызовы функций, является реентерабельным. Поскольку GCC не поддерживает платформы, где нерегенерируемые вызовы функций распространены, такие как 8051, существует небольшой риск возникновения проблем компилятора с повторным входом.
Есть порты GCC, которые имеют ошибки и проблемы, такие как версия MSP430.