C Language
Comportamiento definido por la implementación
Buscar..
Observaciones
Visión general
El estándar de C describe la sintaxis del lenguaje, las funciones proporcionadas por la biblioteca estándar y el comportamiento de los procesadores de C conformes (en términos generales, compiladores) y los programas de C conformes. Con respecto al comportamiento, el estándar en su mayor parte especifica comportamientos particulares para programas y procesadores. Por otro lado, algunas operaciones tienen un comportamiento indefinido explícito o implícito, tales operaciones siempre deben evitarse, ya que no se puede confiar en nada sobre ellas. En el medio, hay una variedad de comportamientos definidos de implementación . Estos comportamientos pueden variar entre los procesadores de C, los tiempos de ejecución y las bibliotecas estándar (colectivamente, implementaciones ), pero son consistentes y confiables para cualquier implementación dada, y las implementaciones correspondientes documentan su comportamiento en cada una de estas áreas.
A veces es razonable que un programa se base en un comportamiento definido por la implementación. Por ejemplo, si el programa es de alguna manera específico para un entorno operativo en particular, es poco probable que el hecho de depender de comportamientos generales definidos por la implementación de los procesadores comunes para ese entorno sea un problema. Alternativamente, uno puede usar directivas de compilación condicional para seleccionar comportamientos definidos por la implementación apropiados para la implementación en uso. En cualquier caso, es esencial saber qué operaciones tienen un comportamiento definido de implementación, ya sea para evitarlas o para tomar una decisión informada sobre si y cómo usarlas.
El balance de estos comentarios constituye una lista de todos los comportamientos y características definidos por la implementación especificados en el estándar C2011, con referencias al estándar. Muchos de ellos utilizan la terminología de la norma . Algunos otros se basan más generalmente en el contexto del estándar, como las ocho etapas de la traducción del código fuente en un programa, o la diferencia entre las implementaciones alojadas y las independientes. Algunos que pueden ser particularmente sorprendentes o notables se presentan en letra negrita. No todos los comportamientos descritos están respaldados por estándares C anteriores, pero en general, tienen comportamientos definidos por la implementación en todas las versiones del estándar que los admiten.
Programas y Procesadores
General
El número de bits en un byte ( 3.6 / 3 ). Al menos
8
, el valor real se puede consultar con la macroCHAR_BIT
.Qué mensajes de salida se consideran "mensajes de diagnóstico" ( 3.10 / 1 )
Fuente de traducción
La manera en que los caracteres multibyte del archivo de origen físico se asignan al conjunto de caracteres de origen ( 5.1.1.2/1 ).
Si las secuencias no vacías de espacios en blanco que no son de nueva línea se reemplazan por espacios individuales durante la fase de traducción 3 ( 5.1.1.2/1 )
Los caracteres del conjunto de ejecución a los que se convierten los literales de caracteres y los caracteres en constantes de cadena (durante la fase de traducción 5) cuando, de lo contrario, no hay ningún carácter correspondiente ( 5.1.1.2/1 ).
Entorno operativo
La manera en que se identifican los mensajes de diagnóstico a emitir ( 5.1.1.3/1 ).
El nombre y el tipo de la función llamada al inicio en una implementación independiente ( 5.1.2.1/1 ).
Qué recursos de biblioteca están disponibles en una implementación independiente, más allá de un conjunto mínimo especificado ( 5.1.2.1/1 ).
El efecto de la terminación del programa en un entorno independiente ( 5.1.2.1/2 ).
En un entorno alojado, cualquier firma permitida para la función
main()
que no seaint main(int argc, char *arg[])
eint main(void)
( 5.1.2.2.1 / 1 ).La manera en que una implementación alojada define las cadenas señaladas por el segundo argumento a
main()
( 5.1.2.2.1 / 2 ).Lo que constituye un "dispositivo interactivo" para los fines de las secciones 5.1.2.3 (Ejecución del programa) y 7.21.3 (Archivos) ( 5.1.2.3/7 ).
Cualquier restricción en los objetos a los que hacen referencia las rutinas de manejo de interrupciones en una implementación de optimización ( 5.1.2.3/10 ).
En una implementación independiente, si se admiten múltiples subprocesos de ejecución ( 5.1.2.4/1 ).
Los valores de los miembros del conjunto de caracteres de ejecución ( 5.2.1 / 1 ).
Los valores de
char
correspondientes a las secuencias de escape alfabéticas definidas ( 5.2.2 / 3 ).Límites y características de enteros y puntos flotantes ( 5.2.4.2/1 ).
La precisión de las operaciones aritméticas de punto flotante y de las conversiones de la biblioteca estándar de representaciones internas de punto flotante a representaciones de cadena ( 5.2.4.2.2 / 6 ).
El valor de la macro
FLT_ROUNDS
, que codifica el modo de redondeo de punto flotante predeterminado ( 5.2.4.2.2 / 8 ).Los comportamientos de redondeo caracterizados por valores soportados de
FLT_ROUNDS
mayores que 3 o menores que -1 ( 5.2.4.2.2 / 8 ).El valor de la macro
FLT_EVAL_METHOD
, que caracteriza el comportamiento de evaluación de punto flotante ( 5.2.4.2.2 / 9 ).El comportamiento se caracteriza por cualquier valor admitido de
FLT_EVAL_METHOD
menor que -1 ( 5.2.4.2.2 / 9 ).Los valores de las macros
FLT_HAS_SUBNORM
,DBL_HAS_SUBNORM
yLDBL_HAS_SUBNORM
, que caracterizan si los formatos de punto flotante estándar admiten números subnormales ( 5.2.4.2.2 / 10 )
Los tipos
El resultado de intentar (indirectamente) acceder a un objeto con una duración de almacenamiento de subprocesos desde un subproceso diferente al que está asociado con el objeto ( 6.2.4 / 4 )
El valor de un
char
al que se ha asignado un carácter fuera del conjunto de ejecución básico ( 6.2.5 / 3 ).Los tipos enteros con signo extendido admitidos, si existen, ( 6.2.5 / 4 ), y cualquier palabra clave de extensión utilizada para identificarlos.
Si
char
tiene la misma representación y comportamiento quesigned char
ounsigned char
( 6.2.5 / 15 ). Se puede consultar conCHAR_MIN
, que es0
oSCHAR_MIN
sichar
no está firmado o firmado, respectivamente.El número, orden y codificación de los bytes en las representaciones de objetos , excepto donde se especifique explícitamente en la norma ( 6.2.6.1/2 ).
Cuál de las tres formas reconocidas de representación de enteros se aplica en cualquier situación dada, y si ciertos patrones de bits de objetos enteros son representaciones de trampas ( 6.2.6.2/2 ).
El requisito de alineación de cada tipo ( 6.2.8 / 1 ).
Si y en qué contextos se admiten las alineaciones extendidas ( 6.2.8 / 3 ).
El conjunto de alineaciones extendidas soportadas ( 6.2.8 / 4 ).
Los rangos de conversión de enteros de cualquier tipo de enteros con signo extendido relacionados entre sí ( 6.3.1.1/1 ).
El efecto de asignar un valor fuera de rango a un entero con signo ( 6.3.1.3/3 ).
Cuando se asigna un valor dentro del rango pero no representable a un objeto de punto flotante, cómo se elige el valor representable almacenado en el objeto entre los dos valores representables más cercanos ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).
El resultado de convertir un entero en un tipo de puntero , excepto las expresiones constantes de enteros con valor
0
( 6.3.2.3/5 ).
Forma de fuente
Las ubicaciones dentro de las directivas
#pragma
donde se reconocen los tokens de nombre de encabezado ( 6.4 / 4 ).Los caracteres, incluidos los caracteres multibyte, excepto el subrayado, las letras latinas sin acento, los nombres de caracteres universales y los dígitos decimales que pueden aparecer en los identificadores ( 6.4.2.1/1 ).
El número de caracteres significativos en un identificador ( 6.4.2.1/5 ).
Con algunas excepciones, la manera en que los caracteres de origen en una constante de caracteres enteros se asignan a los caracteres del conjunto de ejecución ( 6.4.4.4/2 ; 6.4.4.4/10 ).
La configuración regional actual utilizada para calcular el valor de una constante de carácter ancho y la mayoría de los demás aspectos de la conversión para muchas de estas constantes ( 6.4.4.4/11 ).
Si se pueden concatenar tokens literales de cadena ancha con prefijos diferentes y, de ser así, el tratamiento de la secuencia de caracteres multibyte resultante ( 6.4.5 / 5 )
La configuración regional utilizada durante la fase de traducción 7 para convertir los literales de cadena ancha en secuencias de caracteres multibyte, y su valor cuando el resultado no se puede representar en el conjunto de caracteres de ejecución ( 6.4.5 / 6 ).
La forma en que los nombres de encabezado se asignan a los nombres de archivo ( 6.4.7 / 2 ).
Evaluación
Si las expresiones de punto flotante se contratan cuando no se usa
FP_CONTRACT
( 6.5 / 8 ).Los valores de los resultados de los operadores
sizeof
y_Alignof
( 6.5.3.4/5 ).El tamaño del tipo de resultado de la resta del puntero ( 6.5.6 / 9 ).
El resultado de desplazar a la derecha un entero con signo con un valor negativo ( 6.5.7 / 5 ).
Comportamiento en tiempo de ejecución
La medida en que la palabra clave de
register
es efectiva ( 6.7.1 / 6 ).Si el tipo de campo de bits declarado como
int
es el mismo tipo queunsigned int
o comosigned int
( 6.7.2 / 5 ).¿Qué tipos de campos de bits pueden tomar, además de
_Bool
calificados,signed int
yunsigned int
; si los campos de bits pueden tener tipos atómicos ( 6.7.2.1/5 ).Aspectos de cómo las implementaciones diseñan el almacenamiento para campos de bits ( 6.7.2.1/11 ).
La alineación de los miembros que no son de campo de bits de estructuras y uniones ( 6.7.2.1/14 ).
El tipo subyacente para cada tipo enumerado ( 6.7.2.2/4 ).
Lo que constituye un "acceso" a un objeto de tipo calificado
volatile
( 6.7.3 / 7 ).La efectividad de las declaraciones de funciones en
inline
( 6.7.4 / 6 ).
Preprocesador
Si las constantes de caracteres se convierten a valores enteros de la misma manera en las condicionales de preprocesador que en las expresiones ordinarias, y si una constante de un solo carácter puede tener un valor negativo ( 6.10.1 / 4 ).
Las ubicaciones buscaron los archivos designados en una directiva
#include
( 6.10.2 / 2-3 ).La forma en que se forma un nombre de encabezado a partir de los tokens de una directiva multiincendio
#include
( 6.10.2 / 4 ).El límite para
#include
anidación ( 6.10.2 / 6 ).Si un
\
carácter se inserta antes de\
introducir un nombre de carácter universal en el resultado del operador#
del preprocesador ( 6.10.3.2/2 ).El comportamiento de la directiva de preprocesamiento
#pragma
para pragmas distintos deSTDC
( 6.10.6 / 1 ).El valor de las macros
__DATE__
y__TIME__
si no hay fecha u hora de traducción, respectivamente, está disponible ( 6.10.8.1/1 ).La codificación de caracteres interna utilizada para
wchar_t
si la macro__STDC_ISO_10646__
no está definida ( 6.10.8.2/1 ).La codificación de caracteres interna utilizada para
char32_t
si la macro__STDC_UTF_32__
no está definida ( 6.10.8.2/1 ).
Biblioteca estándar
General
- El formato de los mensajes emitidos cuando fallan las aserciones ( 7.2.1.1/2 ).
Funciones de entorno de punto flotante
Cualquier excepción adicional de punto flotante más allá de las definidas por el estándar ( 7.6 / 6 ).
Cualquier modo de redondeo de punto flotante adicional más allá de los definidos por el estándar ( 7.6 / 8 ).
Cualquier entorno de punto flotante adicional más allá de los definidos por el estándar ( 7.6 / 10 ).
El valor predeterminado del conmutador de acceso de entorno de punto flotante ( 7.6.1 / 2 ).
La representación de los indicadores de estado de punto flotante registrados por
fegetexceptflag()
( 7.6.2.2/1 ).Si la función
feraiseexcept()
aumenta adicionalmente la excepción de punto flotante "inexacta" cada vez que genera la excepción de punto flotante de "desbordamiento" o "subdesbordamiento" ( 7.6.2.3/2 ).
Funciones relacionadas con la localización
- Las cadenas de locale que no sean
"C"
compatibles consetlocale()
( 7.11.1.1/3 ).
Funciones matematicas
Los tipos representados por
float_t
ydouble_t
cuando la macroFLT_EVAL_METHOD
tiene un valor diferente de0
,1
y2
( 7.12 / 2 ).Cualquier clasificación de punto flotante admitida más allá de las definidas por el estándar ( 7.12 / 6 ).
El valor devuelto por las funciones
math.h
en el caso de un error de dominio ( 7.12.1 / 2 ).El valor devuelto por las funciones
math.h
en el caso de un error de polo ( 7.12.1 / 3 ).El valor devuelto por las funciones
math.h
cuando el resultado se desborda, y los aspectos de sierrno
se establece enERANGE
y si seERANGE
una excepción de punto flotante en esas circunstancias ( 7.12.1 / 6 ).El valor predeterminado del interruptor de contracción FP ( 7.12.2 / 2 ).
Si las funciones
fmod()
devuelven 0 ofmod()
un error de dominio cuando su segundo argumento es 0 ( 7.12.10.1/3 ).Si las funciones
remainder()
devuelven 0 o generan un error de dominio cuando su segundo argumento es 0 ( 7.12.10.2/3 ).El número de bits significativos en los módulos de cociente calculados por las funciones
remquo()
( 7.12.10.3/2 ).Si las funciones
remquo()
devuelven 0 oremquo()
un error de dominio cuando su segundo argumento es 0 ( 7.12.10.3/3 ).
Señales
El conjunto completo de señales admitidas, su semántica y su manejo predeterminado ( 7.14 / 4 ).
Cuando se genera una señal y hay un controlador personalizado asociado con esa señal, las señales, si las hay, se bloquean durante la ejecución del controlador ( 7.14.1.1/3 ).
Las señales que no sean
SIGFPE
,SIGILL
ySIGSEGV
causan que el comportamiento al regresar de un controlador de señal personalizado no esté definido ( 7.14.1.1/3 ).Las señales que inicialmente están configuradas para ser ignoradas (independientemente de su manejo predeterminado; 7.14.1.1/6 ).
Diverso
- La constante de puntero nulo específica a la que se expande la macro
NULL
( 7.19 / 3 ).
Funciones de manejo de archivos.
Si la última línea de un flujo de texto requiere una nueva línea de terminación ( 7.21.2 / 2 ).
El número de caracteres nulos se anexa automáticamente a una secuencia binaria ( 7.21.2 / 3 ).
La posición inicial de un archivo abierto en modo de adición ( 7.21.3 / 1 ).
Si una escritura en una secuencia de texto hace que la secuencia se trunca ( 7.21.3 / 2 ).
Soporte para buffering de flujo ( 7.21.3 / 3 ).
Si existen realmente archivos de longitud cero ( 7.21.3 / 4 ).
Las reglas para componer nombres de archivos válidos ( 7.21.3 / 8 ).
Si el mismo archivo se puede abrir simultáneamente varias veces ( 7.21.3 / 8 ).
La naturaleza y la elección de la codificación para caracteres multibyte ( 7.21.3 / 10 ).
El comportamiento de la función
remove()
cuando el archivo de destino está abierto ( 7.21.4.1/2 ).El comportamiento de la función
rename()
cuando el archivo de destino ya existe ( 7.21.4.2/2 ).Si los archivos creados a través de la función
tmpfile()
se eliminan en caso de que el programa finalice de manera anormal ( 7.21.4.3/2 ).Qué modo cambia en qué circunstancias se permiten a través de
freopen()
( 7.21.5.4/3 ).
Funciones de E / S
¿Cuál de las representaciones permitidas de los valores infinitos y no de número de PF son producidos por las funciones de familia printf () - ( 7.21.6.1/8 ).
La forma en que los punteros son formateados por las funciones de familia
printf()
( 7.21.6.1/8 ).El comportamiento de
scanf()
-family funciona cuando el carácter-
aparece en una posición interna de la lista de escaneo de un[
campo ( 7.21.6.2/12 ).La mayoría de los aspectos de las funciones de
scanf()
-family 'manejan los camposp
( 7.21.6.2/12 ).El valor
errno
establecido porfgetpos()
en caso de error ( 7.21.9.1/2 ).El valor
errno
establecido porfsetpos()
en caso de fallo ( 7.21.9.3/2 ).El valor
errno
establecido porftell()
en caso de fallo ( 7.21.9.4/3 ).El significado de las funciones de familia
strtod()
de algunos aspectos soportados de un formato NaN ( 7.22.1.3p4 ).Si las funciones de familia
strtod()
configuranerrno
enERANGE
cuando el resultado se desborda ( 7.22.1.3/10 ).
Funciones de asignación de memoria
- El comportamiento de las funciones de asignación de memoria cuando el número de bytes solicitados es 0 ( 7.22.3 / 1 ).
Funciones del entorno del sistema
Qué limpiezas, si las hay, se realizan y qué estado se devuelve al sistema operativo del host cuando se llama a la función
abort()
( 7.22.4.1/2 ).Qué estado se devuelve al entorno de host cuando se llama a
exit()
( 7.22.4.4/5 ).El manejo de las secuencias abiertas y el estado que se devuelve al entorno del host cuando se llama
_Exit()
( 7.22.4.5/2 ).El conjunto de nombres de entorno accesibles a través de
getenv()
y el método para modificar el entorno ( 7.22.4.6/2 ).El valor de retorno de la función
system()
( 7.22.4.8/3 ).
Funciones de fecha y hora.
La zona horaria local y el horario de verano ( 7.27.1 / 1 ).
El rango y la precisión de los tiempos se pueden representar a través de los tipos
clock_t
ytime_t
( 7.27.1 / 4 ).El comienzo de la era que sirve como referencia para los tiempos devueltos por la función
clock()
( 7.27.2.1/3 ).El comienzo de la época que sirve como referencia para los tiempos devueltos por la función
timespec_get()
(cuando la base de tiempo esTIME_UTC
; 7.27.2.5/3 ).El reemplazo de
strftime()
para el especificador de conversión%Z
en la configuración regional "C" ( 7.27.3.5/7 ).
Funciones de E / S de caracteres anchos
¿Cuál de las representaciones permitidas de los valores de PF infinitos y sin número se producen mediante las funciones de familia
wprintf()
( 7.29.2.1/8 )?La forma en que los punteros son formateados por las funciones de familia
wprintf()
( 7.29.2.1/8 ).El comportamiento de
wscanf()
-family funciona cuando el carácter-
aparece en una posición interna de la lista de exploración de un[
campo ( 7.29.2.2/12 ).La mayoría de los aspectos de las
wscanf()
de lawscanf()
entregan los camposp
( 7.29.2.2/12 ).El significado de las funciones de familia
wstrtod()
de algunos aspectos soportados del formato NaN ( 7.29.4.1.1 / 4 ).Si las funciones de familia
wstrtod()
configuranerrno
enERANGE
cuando el resultado se desborda ( 7.29.4.1.1 / 10 ).
Desplazamiento a la derecha de un entero negativo
int signed_integer = -1;
// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;
Asignar un valor fuera de rango a un entero
// 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;
Asignación de cero bytes
// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);
Representación de enteros con signo
Cada tipo entero con signo se puede representar en uno de los tres formatos; está definido por la implementación cuál se usa. La implementación en uso para cualquier tipo de entero con signo dado al menos tan ancho como int
puede determinarse en tiempo de ejecución a partir de los dos bits de orden más bajo de la representación del valor -1
en ese tipo, así:
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"); }
}
El mismo patrón se aplica a la representación de tipos más estrechos, pero esta técnica no puede probarlos porque los operandos de &
están sujetos a "las conversiones aritméticas habituales" antes de que se calcule el resultado.