Compartir a través de


Advertencia C26437

No segmentar.

C++ Core Guidelines: ES.63: No segmentar

El lenguaje permite la segmentación y se puede ver como un caso especial de una conversión implícita peligrosa. Incluso si se hace intencionadamente y no conduce a problemas inmediatos, sigue siendo muy desaconsejado. Hace que el código sea más difícil de cambiar al forzar requisitos adicionales en los tipos de datos relacionados. Es especialmente cierto si los tipos son polimórficos o implican la administración de recursos.

Comentarios

Esta regla advierte no solo sobre asignaciones explícitas, sino también sobre la segmentación implícita. La segmentación implícita se produce cuando se devuelve un resultado de la función actual o cuando los datos se pasan a otras funciones.

La regla también marca los casos en los que una asignación no implica la segmentación de datos reales (por ejemplo, si los tipos están vacíos o no realizan manipulaciones de datos peligrosas). Estas advertencias deben corregirse para evitar regresiones no deseadas si los tipos de datos o los comportamientos cambian en el futuro.

Ejemplo

En el siguiente ejemplo de código, se lee id_ex, pero el autor de la llamada de la función solo obtendrá un segmento del objeto :

struct id {
    int value;
};

struct id_ex : id {
    int extension;
};

bool read_id(stream &s, id &v) {
    id_ex tmp{};
    if (!s.read(tmp.value) || !s.read(tmp.extension))
        return false;

    v = tmp; // C26437
    return true;
}

Para corregir el problema, actualice la función para usar los tipos correctos:

// ...
bool read_id(stream &s, id_ex &v) {
// ...