Buscar

Capítulo 16. Compiladores y herramientas de desarrollo

download PDF

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 como strncat, strncpy, o stpncpy 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 como memcpy o realloc.

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 11 auto 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

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ónMuestra avisos para

-Wstringop-truncation

Llamadas a funciones de manipulación de cadenas acotadas como strncat, strncpy, y stpncpy que pueden truncar la cadena copiada o dejar el destino sin cambios.

-Wclass-memaccess

Objetos de tipos de clase no triviales manipulados de forma potencialmente insegura por funciones de memoria bruta como memcpy o realloc.

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.

-Wmisleading-indentation

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.

-Walloc-size-larger-than=size

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 alloc_size.

-Walloc-zero

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 alloc_size.

-Walloca

Todas las llamadas a la función alloca.

-Walloca-larger-than=size

Llamadas a la función alloca cuando la memoria solicitada es superior a size.

-Wvla-larger-than=size

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.

-Wformat-overflow=level

Desbordamiento de búfer seguro y probable en las llamadas a la familia de funciones de salida formateada sprintf. Para más detalles y explicación del valor level, consulte la página del manual gcc(1).

-Wformat-truncation=level

Truncamiento de la salida, tanto seguro como probable, en las llamadas a la familia de funciones de salida formateada snprintf. Para más detalles y explicación del valor level, consulte la página del manual gcc(1).

-Wstringop-overflow=type

Desbordamiento del búfer en las llamadas a funciones de manejo de cadenas como memcpy y strcpy. Para más detalles y explicación del valor level, consulte la página del manual gcc(1).

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 como memcpy y strcpy.
  • 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 atributo nonnull).

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ónConsulte

-fsanitize=float-divide-by-zero

Detecta la división por cero en coma flotante.

-fsanitize=float-cast-overflow

Comprueba que el resultado de las conversiones de tipo punto flotante a entero no se desborda.

-fsanitize=bounds

Habilitar la instrumentación de los límites de la matriz y detectar los accesos fuera de los límites.

-fsanitize=alignment

Habilita la comprobación de la alineación y detecta varios objetos desalineados.

-fsanitize=object-size

Habilitar la comprobación del tamaño de los objetos y detectar varios accesos fuera de los límites.

-fsanitize=vptr

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.

-fsanitize=bounds-strict

Habilitar la comprobación estricta de los límites de los arrays. Esto permite -fsanitize=bounds y la instrumentación de matrices flexibles similares a los miembros del array.

-fsanitize=signed-integer-overflow

Diagnosticar desbordamientos aritméticos incluso en operaciones aritméticas con vectores genéricos.

-fsanitize=builtin

Diagnostica en tiempo de ejecución los argumentos no válidos de los buildins prefijados en __builtin_clz o __builtin_ctz. Incluye comprobaciones de -fsanitize=undefined.

-fsanitize=pointer-overflow

Realiza pruebas baratas en tiempo de ejecución para la envoltura de punteros. Incluye comprobaciones de -fsanitize=undefined.

Nuevas opciones para AddressSanitizer

Estas opciones se han añadido a AddressSanitizer:

OpciónConsulte

-fsanitize=pointer-compare

Advierte sobre la comparación de punteros que apuntan a un objeto de memoria diferente.

-fsanitize=pointer-subtract

Advierte sobre la sustracción de punteros que apuntan a un objeto de memoria diferente.

-fsanitize-address-use-after-scope

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.

Red Hat logoGithubRedditYoutubeTwitter

Aprender

Pruebe, compre y venda

Comunidades

Acerca de la documentación de Red Hat

Ayudamos a los usuarios de Red Hat a innovar y alcanzar sus objetivos con nuestros productos y servicios con contenido en el que pueden confiar.

Hacer que el código abierto sea más inclusivo

Red Hat se compromete a reemplazar el lenguaje problemático en nuestro código, documentación y propiedades web. Para más detalles, consulte el Blog de Red Hat.

Acerca de Red Hat

Ofrecemos soluciones reforzadas que facilitan a las empresas trabajar en plataformas y entornos, desde el centro de datos central hasta el perímetro de la red.

© 2024 Red Hat, Inc.