ОРИГИНАЛЬНЫЙ ВОПРОС:
Я ищу стандарт C90 для вещей, о которых нужно знать, при написании высокодоходного кода, не имея большого доверия к доброй воле поставщика компилятора и предполагая, что мое программное обеспечение иногда может кого-то убивать, если я что-то делаю неправильно. Скажем, я немного параноик.
В настоящий момент я думаю о "лимитах перевода" (5.2.4.1 ANSI/ISO 9899: 1990). Как указано в стандарте и в: "ли ansi C ограничивает количество внешних переменных в программе?", это минимальные требования для стандартного соответствия реализация. Теперь, с другой стороны, это означает, что любая реализация не должна делать больше - и если я хочу быть уверенным, что мой код работает для любой реализации confrom, эти лимиты представляют собой абсолютные ограничения для меня.
До сих пор так раздражает.
Таким образом, поставщик компилятора выбирает лимиты, равные или превышающие минимальные требуемые пределы трансакций.
Что происходит сейчас, если вы превысите эти ограничения, связанные с реализацией, для конкретной реализации? В моей копии ANSI/IO 9899: 1990 (C90) я ничего не нашел, поэтому я думаю, что это Undefined Поведение "3. вида" (бездействия). С другой стороны, это было бы не в первый раз, когда я неправильно понял стандарт или не нашел правильный проход.
Итак, вот мои вопросы:
-
Превышает пределы перевода определенного поведения реализации Undefined в C90?
-
Поддерживается ли поведение C90 для исправленных версий до C95/C96 и для новых итераций C99 и C11?
-
Кто-нибудь видел инструмент проверки, который проверяет минимальные или (инструменты) пользовательские ограничения?
АСПЕКТЫ ЗА ОРИГИНАЛЬНЫМ ВОПРОСОМ:
Интересные аспекты в ответах и комментариях:
1) Как Майкл Барр указал в прямом комментарии к вопросу, согласно C -Стандарт (я только проверил C90 без исправлений, а проект C99, Майкл ссылался на здесь), реализация c в C должна только принимать ОДНУ программу, который содержит все пределы одновременно, что в строжайшей интерпретации аннулирует любые минимальные гарантии.
2) В качестве rubenvb и Keith Thompson отметили, что реализация какого-то качества должна обеспечивать диагностику для случая, что их реализация определены пределы превышены, особенно если они не соответствуют минимальным требованиям (rubenvb связал пример для MSVC в comment).
3) Поскольку превышение пределов компилятора может быть Undefined, но, несомненно, приведет к некоторой ошибке, значения "переменных", к которым применяются ограничения перевода для определенной части моего кода, представляют собой предпосылки для повторного использования.
Мои личные стратегии борьбы с ними
1) Итак, для максимальной паранойи я сделаю из себя дурака и раздражу поддержку продавцов компилятора с просьбой гарантировать меня, что лимиты, выбранные реализацией, применимы к любой программе.: - (
2) Итак, я буду исследовать документацию компилятора и способность страдать от поддержки компилятора для получения подтверждения, что: - что для каждого предела перевода, если превышено, диагностика будет поднята, и - потому что это поведение Undefined, если каждый экземпляр превышения предела перевода приведет к диагностике - или еще одна ошибка уже предотвратила компиляцию.
3) Таким образом, я постараюсь получить инструмент (или разработать сам, если я действительно должен), который измеряет эти значения и предоставляет их в качестве предварительного условия для повторного использования кода для моей программы. Как отметил Keith Thompson в этом ответе , некоторые из значений могут потребовать более глубоких знаний о том, как осуществляется реализация... реализован. Я не совсем уверен, что может помочь в таких случаях помимо действий в 2.), но, насколько я вижу, мне нужно проверить - но мне нужно только проверить, есть ли UB (без диагностики), и если это случай, успешный тест не может гарантировать правильность в общем случае.
ОТВЕТИЛ:
Да, это поведение Undefined путем пропуска.
Кейт Томпсон показал в своем (принятом) anwser терминологию и ссылку на стандартные документы C, что это поведение Undefined.
Инструмент, который проверяет ограничения транзакций в коде, пока еще не обнаружен комментаторами. Если инструмент появляется у любого, у кого есть (даже частично) эти функции, оставьте ответ или комментарий.