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 macro CHAR_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 sea int main(int argc, char *arg[]) e int 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 y LDBL_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 que signed char o unsigned char ( 6.2.5 / 15 ). Se puede consultar con CHAR_MIN , que es 0 o SCHAR_MIN si char 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 que unsigned int o como signed int ( 6.7.2 / 5 ).

  • ¿Qué tipos de campos de bits pueden tomar, además de _Bool calificados, signed int y unsigned 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 de STDC ( 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 con setlocale() ( 7.11.1.1/3 ).

Funciones matematicas

  • Los tipos representados por float_t y double_t cuando la macro FLT_EVAL_METHOD tiene un valor diferente de 0 , 1 y 2 ( 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 si errno se establece en ERANGE y si se ERANGE 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 o fmod() 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 o remquo() 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 y SIGSEGV 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 campos p ( 7.21.6.2/12 ).

  • El valor errno establecido por fgetpos() en caso de error ( 7.21.9.1/2 ).

  • El valor errno establecido por fsetpos() en caso de fallo ( 7.21.9.3/2 ).

  • El valor errno establecido por ftell() 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() configuran errno en ERANGE 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 y time_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 es TIME_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 la wscanf() entregan los campos p ( 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() configuran errno en ERANGE 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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow