Capítulo 16. Compiladores y herramientas de desarrollo
16.1. Cambios en la cadena de herramientas desde RHEL 7
Las siguientes secciones enumeran los cambios en la cadena de herramientas desde el lanzamiento de los componentes descritos en Red Hat Enterprise Linux
16.1.1. Cambios en GCC en RHEL 8
En Red Hat Enterprise Linux 8, la cadena de herramientas GCC está basada en la serie de versiones GCC 8.2. Los cambios notables desde Red Hat Enterprise Linux 7 incluyen:
- Se han añadido numerosas optimizaciones generales, como el análisis de alias, las mejoras del vectorizador, el plegado de código idéntico, el análisis interprocedimental, el pase de optimización de la fusión de almacenes y otras.
- Se ha mejorado el desinfectante de direcciones.
- Se ha añadido el Sanitizador de fugas para la detección de fugas de memoria.
- Se ha añadido el Sanitizador de Comportamientos Indefinidos para la detección de comportamientos indefinidos.
- Ahora se puede producir información de depuración en el formato DWARF5. Esta capacidad es experimental.
- La herramienta de análisis de cobertura del código fuente GCOV se ha ampliado con varias mejoras.
- Se ha añadido soporte para la especificación OpenMP 4.5. Además, las características de descarga de la especificación OpenMP 4.0 son ahora compatibles con los compiladores de C, C , y Fortran.
- Se han añadido nuevas advertencias y diagnósticos mejorados para la detección estática de ciertos errores probables de programación.
- Las ubicaciones de las fuentes ahora se rastrean como rangos en lugar de puntos, lo que permite un diagnóstico mucho más rico. El compilador ofrece ahora pistas de "arreglo", sugiriendo posibles modificaciones del código. Se ha añadido un corrector ortográfico para ofrecer nombres alternativos y facilitar la detección de errores tipográficos.
Seguridad
GCC se ha ampliado para proporcionar herramientas que garanticen un endurecimiento adicional del código generado. Las mejoras relacionadas con la seguridad incluyen:
-
Se han añadido las funciones incorporadas
__builtin_add_overflow
,__builtin_sub_overflow
, y__builtin_mul_overflow
para la aritmética con comprobación de desbordamiento. -
Se ha añadido la opción
-fstack-clash-protection
para generar código adicional de protección contra el choque de pilas. -
La opción
-fcf-protection
se introdujo para comprobar las direcciones de destino de las instrucciones de flujo de control para aumentar la seguridad del programa. -
La nueva opción de advertencia
-Wstringop-truncation
enumera las llamadas a funciones de manipulación de cadenas delimitadas comostrncat
,strncpy
, ostpncpy
que podrían truncar la cadena copiada o dejar el destino sin cambios. -
Se ha mejorado la opción de advertencia
-Warray-bounds
para detectar mejor los índices de matrices y los desplazamientos de punteros fuera de los límites. -
Se ha añadido la opción de advertencia
-Wclass-memaccess
para advertir sobre la manipulación potencialmente insegura de objetos de tipos de clase no triviales mediante funciones de acceso a memoria bruta comomemcpy
orealloc
.
Arquitectura y soporte del procesador
Las mejoras en la arquitectura y el soporte del procesador incluyen:
- Se han añadido múltiples opciones nuevas específicas para la arquitectura Intel AVX-512, varias de sus microarquitecturas y las extensiones de protección de software de Intel (SGX).
- La generación de código ahora puede dirigirse a las extensiones LSE de la arquitectura ARM de 64 bits, a las extensiones de punto flotante (FPE) de 16 bits de ARMv8.2-A y a las versiones de la arquitectura ARMv8.2-A, ARMv8.3-A y ARMv8.4-A.
-
Se ha corregido la gestión de la opción
-march=native
en las arquitecturas ARM y ARM de 64 bits. - Se ha añadido soporte para los procesadores z13 y z14 de la arquitectura IBM Z.
Lenguas y normas
Entre los cambios notables relacionados con las lenguas y las normas se encuentran:
- El estándar por defecto utilizado al compilar código en el lenguaje C ha cambiado a C17 con extensiones GNU.
- El estándar por defecto utilizado al compilar código en el lenguaje C ha cambiado a C 14 con extensiones GNU.
- La biblioteca de tiempo de ejecución de C es ahora compatible con los estándares C 11 y C 14.
-
El compilador de C ahora implementa el estándar C 14 con muchas características nuevas, como plantillas de variables, agregados con inicializadores de miembros de datos no estáticos, el especificador extendido
constexpr
, funciones de desasignación de tamaño, lambdas genéricas, matrices de longitud variable, separadores de dígitos y otros. - Se ha mejorado el soporte del lenguaje C estándar C11: Ahora están disponibles los atómicos ISO C11, las selecciones genéricas y el almacenamiento local de hilos.
-
La nueva extensión
__auto_type
GNU C proporciona un subconjunto de la funcionalidad de la palabra clave C 11auto
en el lenguaje C. -
Los nombres de los tipos
_FloatN
y_FloatNx
especificados por la norma ISO/IEC TS 18661-3:2015 son ahora reconocidos por el front end de C. -
El estándar por defecto utilizado al compilar código en el lenguaje C ha cambiado a C17 con extensiones GNU. Esto tiene el mismo efecto que utilizar la opción
--std=gnu17
. Anteriormente, el estándar por defecto era C89 con extensiones GNU. - GCC puede ahora compilar experimentalmente código utilizando el estándar del lenguaje C 17 y ciertas características del estándar C 20.
- Pasar una clase vacía como argumento ahora no ocupa espacio en las arquitecturas Intel 64 y AMD64, como lo requiere la ABI de la plataforma. Pasar o devolver una clase con sólo constructores de copia y movimiento eliminados ahora utiliza la misma convención de llamada que una clase con un constructor de copia o movimiento no trivial.
-
El valor devuelto por el operador C 11
alignof
ha sido corregido para que coincida con el operador C_Alignof
y devuelva la alineación mínima. Para encontrar la alineación preferida, utilice la extensión GNU__alignof__
. -
La versión principal de la biblioteca
libgfortran
para el código del lenguaje Fortran se ha cambiado a la 5. - Se ha eliminado el soporte para los lenguajes Ada (GNAT), GCC Go y Objective C/C. Utilice el conjunto de herramientas Go para el desarrollo de código Go.
Recursos adicionales
- Consulte también las Notas de la versión de Red Hat Enterprise Linux 8.
- Uso de Go Toolset
16.1.2. Mejoras de seguridad en GCC en RHEL 8
Esta sección describe en detalle los cambios en GCC relacionados con la seguridad y añadidos desde el lanzamiento de Red Hat Enterprise Linux
Nuevas advertencias
Se han añadido estas opciones de advertencia:
Opción | Muestra avisos para |
---|---|
|
Llamadas a funciones de manipulación de cadenas acotadas como |
|
Objetos de tipos de clase no triviales manipulados de forma potencialmente insegura por funciones de memoria bruta como La advertencia ayuda a detectar las llamadas que evitan los constructores definidos por el usuario o los operadores de asignación de copias, los punteros de tablas virtuales corruptas, los miembros de datos de tipos o referencias calificados como const, o los punteros de miembros. La advertencia también detecta las llamadas que podrían eludir los controles de acceso a los miembros de datos. |
| Lugares donde la sangría del código da una idea errónea de la estructura de bloques del código a un lector humano. |
|
Llamadas a funciones de asignación de memoria en las que la cantidad de memoria a asignar supera size. También funciona con funciones en las que la asignación se especifica multiplicando dos parámetros y con cualquier función decorada con el atributo |
|
Llamadas a funciones de asignación de memoria que intentan asignar una cantidad cero de memoria. También funciona con funciones en las que la asignación se especifica multiplicando dos parámetros y con cualquier función decorada con el atributo |
|
Todas las llamadas a la función |
|
Llamadas a la función |
| Definiciones de matrices de longitud variable (VLA) que pueden superar el tamaño especificado o cuyo límite no se sabe si está suficientemente restringido. |
|
Desbordamiento de búfer seguro y probable en las llamadas a la familia de funciones de salida formateada |
|
Truncamiento de la salida, tanto seguro como probable, en las llamadas a la familia de funciones de salida formateada |
|
Desbordamiento del búfer en las llamadas a funciones de manejo de cadenas como |
Advertencia de mejoras
Estas advertencias de GCC han sido mejoradas:
-
La opción
-Warray-bounds
se ha mejorado para detectar más casos de índices de matrices y desplazamientos de punteros fuera de los límites. Por ejemplo, se detectan los índices negativos o excesivos en miembros de matrices flexibles y literales de cadena. -
La opción
-Wrestrict
introducida en GCC 7 ha sido mejorada para detectar muchos más casos de accesos solapados a objetos a través de argumentos restringidos a funciones estándar de manipulación de memoria y cadenas comomemcpy
ystrcpy
. -
La opción
-Wnonnull
se ha mejorado para detectar un conjunto más amplio de casos de paso de punteros nulos a funciones que esperan un argumento no nulo (decorado con el atributononnull
).
Nuevo UndefinedBehaviorSanitizer
Se ha añadido un nuevo sanitizador en tiempo de ejecución para detectar comportamientos indefinidos llamado UndefinedBehaviorSanitizer. Cabe destacar las siguientes opciones:
Opción | Consulte |
---|---|
| Detecta la división por cero en coma flotante. |
| Comprueba que el resultado de las conversiones de tipo punto flotante a entero no se desborda. |
| Habilitar la instrumentación de los límites de la matriz y detectar los accesos fuera de los límites. |
| Habilita la comprobación de la alineación y detecta varios objetos desalineados. |
| Habilitar la comprobación del tamaño de los objetos y detectar varios accesos fuera de los límites. |
| Permitir la comprobación de las llamadas a funciones miembro de C, los accesos a miembros y algunas conversiones entre punteros a clases base y derivadas. Además, detecta cuando los objetos referenciados no tienen el tipo dinámico correcto. |
|
Habilitar la comprobación estricta de los límites de los arrays. Esto permite |
| Diagnosticar desbordamientos aritméticos incluso en operaciones aritméticas con vectores genéricos. |
|
Diagnostica en tiempo de ejecución los argumentos no válidos de los buildins prefijados en |
|
Realiza pruebas baratas en tiempo de ejecución para la envoltura de punteros. Incluye comprobaciones de |
Nuevas opciones para AddressSanitizer
Estas opciones se han añadido a AddressSanitizer:
Opción | Consulte |
---|---|
| Advierte sobre la comparación de punteros que apuntan a un objeto de memoria diferente. |
| Advierte sobre la sustracción de punteros que apuntan a un objeto de memoria diferente. |
| Sanear las variables cuya dirección se toma y se utiliza después de un ámbito donde se define la variable. |
Otros desinfectantes e instrumentos
-
Se ha añadido la opción
-fstack-clash-protection
para insertar sondas cuando el espacio de la pila se asigna de forma estática o dinámica para detectar de forma fiable los desbordamientos de la pila y así mitigar el vector de ataque que se basa en el salto de una página de guarda de la pila proporcionada por el sistema operativo. -
Se ha añadido una nueva opción
-fcf-protection=[full|branch|return|none]
para realizar la instrumentación del código y aumentar la seguridad del programa comprobando que las direcciones de destino de las instrucciones de transferencia de flujo de control (como la llamada indirecta a una función, el retorno de una función o el salto indirecto) son válidas.
Recursos adicionales
Para más detalles y explicación de los valores suministrados a algunas de las opciones anteriores, consulte la página del manual gcc(1):
$ man gcc
16.1.3. Cambios que rompen la compatibilidad en GCC en RHEL 8
C Cambio de ABI en std::string
y std::list
La interfaz binaria de aplicación (ABI) de las clases std::string
y std::list
de la biblioteca libstdc
cambió entre RHEL 7 (GCC 4.8) y RHEL 8 (GCC 8) para ajustarse al estándar C 11. La biblioteca libstdc
soporta tanto la antigua como la nueva ABI, pero algunas otras bibliotecas del sistema C no lo hacen. Como consecuencia, las aplicaciones que enlazan dinámicamente con estas bibliotecas tendrán que ser reconstruidas. Esto afecta a todos los modos estándar de C, incluyendo C 98. También afecta a las aplicaciones creadas con los compiladores de Red Hat Developer Toolset para RHEL 7, que mantuvieron la antigua ABI para mantener la compatibilidad con las bibliotecas del sistema.
GCC ya no construye código Ada, Go y Objective C/C
Se ha eliminado del compilador GCC la capacidad de construir código en los lenguajes Ada (GNAT), GCC Go y Objective C/C.
Para construir código Go, utilice el conjunto de herramientas Go.