Поиск…


замечания

обзор

Стандарт C описывает синтаксис языка, функции, предоставляемые стандартной библиотекой, и поведение совместимых процессоров C (грубо говоря, компиляторов) и соответствующих программ C. Что касается поведения, стандарт в большинстве случаев указывает на специфическое поведение программ и процессоров. С другой стороны, некоторые операции имеют явное или неявное неопределенное поведение - таких операций всегда следует избегать, так как вы не можете полагаться на что-либо о них. Между ними существует множество вариантов поведения, определенных для реализации . Такое поведение может варьироваться между процессорами C, временем выполнения и стандартными библиотеками (в совокупности, реализациями ), но они являются последовательными и надежными для любой конкретной реализации, а соответствующие реализации документируют их поведение в каждой из этих областей.

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

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

Программы и процессоры

генеральный

  • Количество бит в одном байте ( 3.6 / 3 ). Не менее 8 , фактическое значение может быть запрошено с помощью макроса CHAR_BIT .

  • Какие выходные сообщения считаются «диагностическими сообщениями» ( 3.10 / 1 )

Перевод исходного текста

  • Способ отображения многобайтовых символов физического исходного файла в исходный набор символов ( 5.1.1.2/1 ).

  • Независимо от того, заменяются ли непустые последовательности пробелов без новой строки единичными пробелами во время фазы перевода 3 ( 5.1.1.2/1 )

  • Символ (ы) выполнения, к которым преобразуются символьные литералы и символы в строковых константах (во время фазы 5 перевода), когда в противном случае нет соответствующего символа ( 5.1.1.2/1 ).

Рабочая среда

  • Порядок идентификации диагностических сообщений ( 5.1.1.3/1 ).

  • Имя и тип функции, вызванной при запуске в автономной реализации ( 5.1.2.1/1 ).

  • Какие библиотечные средства доступны в автономной реализации за пределами заданного минимального набора ( 5.1.2.1/1 ).

  • Эффект завершения программы в автономной среде ( 5.1.2.1/2 ).

  • В размещенной среде любые допустимые сигнатуры для функции main() отличные от int main(int argc, char *arg[]) и int main(void) ( 5.1.2.2.1 / 1 ).

  • Способ, которым размещенная реализация определяет строки, на которые указывает второй аргумент main() ( 5.1.2.2.1 / 2 ).

  • Что представляет собой «интерактивное устройство» для целей разделов 5.1.2.3 (Исполнение программы) и 7.21.3 (Файлы) ( 5.1.2.3/7 ).

  • Любые ограничения на объекты, на которые ссылаются процедуры прерывания-обработчика в оптимизирующей реализации ( 5.1.2.3/10 ).

  • В автономной реализации поддерживается ли несколько потоков выполнения ( 5.1.2.4/1 ).

  • Значения элементов набора символов выполнения ( 5.2.1 / 1 ).

  • Значения char соответствующие определенным алфавитным escape-последовательностям ( 5.2.2 / 3 ).

  • Целочисленные и числовые ограничения и характеристики с плавающей запятой ( 5.2.4.2/1 ).

  • Точность арифметических операций с плавающей запятой и преобразований стандартной библиотеки из внутренних представлений с плавающей запятой в строковые представления ( 5.2.4.2.2 / 6 ).

  • Значение макроса FLT_ROUNDS , которое кодирует режим округления с плавающей запятой по умолчанию ( 5.2.4.2.2 / 8 ).

  • FLT_ROUNDS округления, характеризуемый поддерживаемыми значениями FLT_ROUNDS более 3 или менее -1 ( 5.2.4.2.2 / 8 ).

  • Значение макроса FLT_EVAL_METHOD , которое характеризует поведение оценки с плавающей запятой ( 5.2.4.2.2 / 9 ).

  • Поведение, характеризуемое любыми поддерживаемыми значениями FLT_EVAL_METHOD меньше -1 ( 5.2.4.2.2 / 9 ).

  • Значения макросов FLT_HAS_SUBNORM , DBL_HAS_SUBNORM и LDBL_HAS_SUBNORM , характеризующие, LDBL_HAS_SUBNORM ли стандартные форматы с плавающей запятой субнормальные числа ( 5.2.4.2.2 / 10 )

Типы

  • Результат попытки (косвенно) доступа к объекту с длительностью хранения потоков из потока, отличного от того, с которым связан объект ( 6.2.4 / 4 )

  • Значение char которому присвоен символ вне базового исполнения ( 6.2.5 / 3 ).

  • Поддерживаемые расширенные подписанные целочисленные типы, если они есть, ( 6.2.5 / 4 ) и любые слова расширения, используемые для их идентификации.

  • Является ли char тем же представлением и поведением, что и signed char или как unsigned char ( 6.2.5 / 15 ). Может запрашиваться с CHAR_MIN , который равен 0 или SCHAR_MIN если char без знака или подписан, соответственно.

  • Число, порядок и кодирование байтов в представлениях объектов , за исключением тех случаев, когда это явно указано стандартом ( 6.2.6.1/2 ).

  • Какая из трех признанных форм целочисленного представления применяется в любой заданной ситуации и являются ли определенные битовые шаблоны целых объектов ловушками ( 6.2.6.2/2 ).

  • Требования к выравниванию каждого типа ( 6.2.8 / 1 ).

  • Будут ли и в каких контекстах поддерживаться любые расширенные выравнивания ( 6.2.8 / 3 ).

  • Набор поддерживаемых расширенных выравниваний ( 6.2.8 / 4 ).

  • Целочисленные числа преобразования любых расширенных целочисленных типов со знаком относительно друг друга ( 6.3.1.1/1 ).

  • Эффект назначения значения вне диапазона значению целого числа ( 6.3.1.3/3 ).

  • Когда для объекта с плавающей запятой назначается неопределенное значение, но нерепрезентативное значение, как представляемое значение, хранящееся в объекте, выбирается из двух ближайших представимых значений ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).

  • Результат преобразования целого числа в тип указателя , за исключением целочисленных константных выражений со значением 0 ( 6.3.2.3/5 ).

Форма источника

  • Расположение в директивах #pragma которых распознаются заголовки заголовков ( 6.4 / 4 ).

  • Символы, включая многобайтовые символы, кроме подчеркивания, латинские буквы без пробелов , универсальные имена символов и десятичные цифры, которые могут отображаться в идентификаторах ( 6.4.2.1/1 ).

  • Число значимых символов в идентификаторе ( 6.4.2.1/5 ).

  • За некоторыми исключениями, порядок, в котором исходные символы в целочисленной символьной константе сопоставляются с установленными символами ( 6.4.4.4/2 , 6.4.4.4/10 ).

  • Текущая локализация, используемая для вычисления значения широкой символьной константы и большинства других аспектов преобразования для многих таких констант ( 6.4.4.4/11 ).

  • Будут ли конкатенированы различные префиксы с широким строковым литеральным литералом, и если да, то обработка полученной многобайтовой последовательности символов ( 6.4.5 / 5 )

  • Локаль, используемая во время фазы перевода 7, для преобразования широких строковых литералов в многобайтовые последовательности символов и их значения, когда результат не представлен в наборе символов выполнения ( 6.4.5 / 6 ).

  • Способ, которым имена заголовков сопоставляются с именами файлов ( 6.4.7 / 2 ).

оценка

  • Независимо от того, FP_CONTRACT ли выражения с плавающей точкой, когда FP_CONTRACT не используется ( 6.5 / 8 ).

  • Значения результатов операторов sizeof и _Alignof ( 6.5.3.4/5 ).

  • Размер результата результата вычитания указателя ( 6.5.6 / 9 ).

  • Результат правого смещения знакового целого с отрицательным значением ( 6.5.7 / 5 ).

Поведение во время выполнения

  • Степень, в которой ключевое слово register действует ( 6.7.1 / 6 ).

  • Является ли тип битового поля, объявленного как int , тем же типом, что и unsigned int или как signed int ( 6.7.2 / 5 ).

  • Какие типы бит могут принимать, кроме необязательно квалифицированных _Bool , signed int и unsigned int ; могут ли битовые поля иметь атомные типы ( 6.7.2.1/5 ).

  • Аспекты того, как реализации выкладывают хранилище для бит-полей ( 6.7.2.1/11 ).

  • Выравнивание небитных элементов структур и объединений ( 6.7.2.1/14 ).

  • Основной тип для каждого перечисленного типа ( 6.7.2.2/4 ).

  • Что представляет собой «доступ» к объекту volatile -qualifed типа ( 6.7.3 / 7 ).

  • Эффективность объявлений inline функций ( 6.7.4 / 6 ).

препроцессор

  • Точно ли символьные константы преобразуются в целые значения таким же образом в условных выражениях препроцессора, как в обычных выражениях, и может ли односимвольная константа иметь отрицательное значение ( 6.10.1 / 4 ).

  • Места искали файлы, указанные в директиве #include ( 6.10.2 / 2-3 ).

  • Способ, с помощью которого имя заголовка формируется из токенов многоточечной директивы #include ( 6.10.2 / 4 ).

  • Предел для #include nesting ( 6.10.2 / 6 ).

  • Вставляет ли символ \ перед \ введением универсального символьного имени в результате выполнения оператора # препроцессора ( 6.10.3.2/2 ).

  • Поведение директивы STDC #pragma для прагм, отличных от STDC ( 6.10.6 / 1 ).

  • Значение макросов __DATE__ и __TIME__ если нет даты или времени перевода, соответственно, доступно ( 6.10.8.1/1 ).

  • Внутренняя кодировка символов, используемая для wchar_t если макрос __STDC_ISO_10646__ не определен ( 6.10.8.2/1 ).

  • Внутренняя кодировка символов, используемая для char32_t если макрос __STDC_UTF_32__ не определен ( 6.10.8.2/1 ).

Стандартная библиотека

генеральный

Функции среды с плавающей запятой

  • Любые дополнительные исключения с плавающей запятой, за исключением тех, которые определены стандартом ( 7.6 / 6 ).

  • Любые дополнительные режимы округления с плавающей запятой, отличные от тех, которые определены стандартом ( 7.6 / 8 ).

  • Любые дополнительные среды с плавающей точкой, отличные от тех, которые определены стандартом ( 7.6 / 10 ).

  • Значение по умолчанию для переключателя доступа к среде с плавающей запятой ( 7.6.1 / 2 ).

  • Представление флагов состояния с плавающей запятой, записанных fegetexceptflag() ( 7.6.2.2/1 ).

  • Является ли feraiseexcept() дополнительно поднимает «неточное» исключение с плавающей запятой всякий раз, когда оно вызывает исключение с плавающей запятой «overflow» или « underflow» ( 7.6.2.3/2 ).

Локальные функции

  • Строки locale, отличные от "C" поддерживаемые setlocale() ( 7.11.1.1/3 ).

Математические функции

  • Типы, представленные float_t и double_t когда макрос FLT_EVAL_METHOD имеет значение, отличное от 0 , 1 и 2 ( 7.12 / 2 ).

  • Любые поддерживаемые классы с плавающей запятой, отличные от тех, которые определены стандартом ( 7.12 / 6 ).

  • Значение, возвращаемое функциями math.h в случае ошибки домена ( 7.12.1 / 2 ).

  • Значение, возвращаемое функциями math.h в случае ошибки полюса ( 7.12.1 / 3 ).

  • Значение, возвращаемое функциями math.h когда результат заканчивается, и аспекты того, установлено ли errno в ERANGE и возникает ли исключение с плавающей точкой в ​​этих обстоятельствах ( 7.12.1 / 6 ).

  • Значение по умолчанию для FP-сокращения ( 7.12.2 / 2 ).

  • Независимо от того, возвращают ли функции fmod() 0 или повышают ошибку домена, когда их второй аргумент равен 0 ( 7.12.10.1/3 ).

  • Независимо от того, возвращают ли функции remainder() 0 или повышают ошибку домена, когда их второй аргумент равен 0 ( 7.12.10.2/3 ).

  • Число значимых битов в факториальных модулях, вычисляемых remquo() ( 7.12.10.3/2 ).

  • remquo() ли функции remquo() 0 или повышают ошибку домена, когда их второй аргумент равен 0 ( 7.12.10.3/3 ).

сигналы

  • Полный набор поддерживаемых сигналов, их семантика и обработка по умолчанию ( 7.14 / 4 ).

  • Когда сигнал поднимается и имеется специальный обработчик, связанный с этим сигналом, какие сигналы, если они есть, блокируются на время выполнения обработчика ( 7.14.1.1/3 ).

  • Какие сигналы, отличные от SIGFPE , SIGILL и SIGSEGV приводят к тому, что поведение при возврате из пользовательского обработчика сигнала не определено ( 7.14.1.1/3 ).

  • Какие сигналы изначально настроены для игнорирования (независимо от их обработки по умолчанию, 7.14.1.1/6 ).

Разнообразный

  • Конкретная константа нулевого указателя, к которой расширяется макрос NULL ( 7.19 / 3 ).

Функции обработки файлов

  • Требуется ли в последней строке текстового потока завершающая строка новой строки ( 7.21.2 / 2 ).

  • Число нулевых символов, автоматически добавленных к двоичному потоку ( 7.21.2 / 3 ).

  • Начальная позиция файла, открытого в режиме добавления ( 7.21.3 / 1 ).

  • Является ли запись в текстовом потоке причиной усечения потока ( 7.21.3 / 2 ).

  • Поддержка буферизации потоков ( 7.21.3 / 3 ).

  • Существуют ли файлы нулевой длины ( 7.21.3 / 4 ).

  • Правила составления допустимых имен файлов ( 7.21.3 / 8 ).

  • Можно ли одновременно открыть один и тот же файл несколько раз ( 7.21.3 / 8 ).

  • Характер и выбор кодирования для многобайтовых символов ( 7.21.3 / 10 ).

  • Поведение функции remove() при открытии целевого файла ( 7.21.4.1/2 ).

  • Поведение функции rename() когда целевой файл уже существует ( 7.21.4.2/2 ).

  • tmpfile() ли файлы, созданные с помощью функции tmpfile() , в случае, если программа завершится ненормально ( 7.21.4.3/2 ).

  • Какой режим изменяется, при каких обстоятельствах разрешается использование freopen() ( 7.21.5.4/3 ).

Функции ввода / вывода

  • Какое из разрешенных представлений значений FP бесконечного и не-номера производится функциями printf () - семейства ( 7.21.6.1/8 ).

  • Способ, с помощью которого указатели форматируются функциями printf() -семейства ( 7.21.6.1/8 ).

  • Поведение функции scanf() -family, когда символ - появляется во внутреннем положении списка сканирования поля [ 7.21.6.2/12 ].

  • Большинство аспектов функции scanf() -семейных функций для p полей ( 7.21.6.2/12 ).

  • Значение errno заданное функцией fgetpos() при сбое ( 7.21.9.1/2 ).

  • Значение errno заданное fsetpos() при ошибке ( 7.21.9.3/2 ).

  • Значение errno установленное ftell() при сбое ( 7.21.9.4/3 ).

  • Значение для strtod() -семейных функций некоторых поддерживаемых аспектов форматирования NaN ( 7.22.1.3p4 ).

  • Независимо от того, функции strtod() -family устанавливают errno в ERANGE когда результат заканчивается ( 7.22.1.3/10 ).

Функции распределения памяти

  • Поведение функций распределения памяти, когда количество запрошенных байтов равно 0 ( 7.22.3 / 1 ).

Функции системной среды

  • Какие очистки, если они есть, и какой статус возвращается ОС хоста при вызове функции abort() ( 7.22.4.1/2 ).

  • Какой статус возвращается в среду хоста при вызове exit() ( 7.22.4.4/5 ).

  • Обработка открытых потоков и какой статус возвращается в среду хоста при _Exit() ( 7.22.4.5/2 ).

  • Набор названий среды, доступных через getenv() и метод изменения среды ( 7.22.4.6/2 ).

  • Возвращаемое значение функции system() ( 7.22.4.8/3 ).

Функции даты и времени

  • Местный часовой пояс и летнее время ( 7.27.1 / 1 ).

  • Диапазон и точность времени, представляемого через типы clock_t и time_t ( 7.27.1 / 4 ).

  • Начало эры, которая служит ссылкой на время, возвращаемое функцией clock() ( 7.27.2.1/3 ).

  • Начало эпохи, которая служит ссылкой на время, возвращаемое timespec_get() (когда временной базой является TIME_UTC ; 7.27.2.5/3 ).

  • Замена strftime() для спецификатора преобразования %Z в локали «C» ( 7.27.3.5/7 ).

Широкосимвольные функции ввода / вывода

  • Какое из разрешенных представлений бесконечных и не-числовых значений FP создаются функциями wprintf() -семейства ( 7.29.2.1/8 ).

  • Способ, с помощью которого указатели форматируются функциями wprintf() -семейства ( 7.29.2.1/8 ).

  • Поведение wscanf() -семейства действует, когда символ - появляется во внутреннем положении списка сканирования поля [ 7.29.2.2/12 ].

  • Большинство аспектов работы wscanf() -семейных функций p полей ( 7.29.2.2/12 ).

  • Значение для wstrtod() -семейных функций некоторых поддерживаемых аспектов форматирования NaN ( 7.29.4.1.1 / 4 ).

  • Независимо от того, функции wstrtod() -family устанавливают errno в ERANGE когда результат заканчивается ( 7.29.4.1.1 / 10 ).

Правый сдвиг отрицательного целого числа

int signed_integer = -1;

// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;

Назначение значения вне диапазона для целого числа

// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;

Выделение нулевых байтов

// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);

Представление знаковых целых чисел

Каждый знаковый целочисленный тип может быть представлен в любом из трех форматов; это определяется реализацией, какая из них используется. Реализация в использовании для любого данного подписанного целого типа , по крайней мере так велик , как int может быть определено во время выполнения из двух битов низшего порядка представления значения -1 в том виде, например , так:

enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)

switch (SIGN_REP(long)) {
   case sign_magnitude: { /* do something */ break; }
   case ones_compl:     { /* do otherwise */ break; }
   case twos_compl:     { /* do yet else  */ break; }
   case 0:  { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}

Тот же шаблон применяется к представлению более узких типов, но они не могут быть проверены этим методом, потому что операнды & подлежат «обычным арифметическим преобразованиям» перед вычислением результата.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow