C Language
Поведение, определяемое реализацией
Поиск…
замечания
обзор
Стандарт 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.2.1.1/2 ).
Функции среды с плавающей запятой
Любые дополнительные исключения с плавающей запятой, за исключением тех, которые определены стандартом ( 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"); }
}
Тот же шаблон применяется к представлению более узких типов, но они не могут быть проверены этим методом, потому что операнды &
подлежат «обычным арифметическим преобразованиям» перед вычислением результата.