El Perfil de por vida de las Pautas básicas de C ++, que forma parte de las Pautas básicas de C ++ , tiene como objetivo detectar problemas de por vida, como punteros colgantes y referencias, en el código de C ++. Utiliza la información de tipo ya presente en la fuente junto con algunos contratos simples entre funciones para detectar defectos en tiempo de compilación con una anotación mínima.
Original en blogEstos son los contratos básicos que el perfil espera que siga el código:
- No use un puntero potencialmente colgante.
- No pase un puntero potencialmente colgante a otra función.
- No devuelva un puntero potencialmente colgante de ninguna función.
Para obtener más información sobre la historia y los objetivos del perfil, consulte la publicación de blog de Herb Sutter sobre la versión 1.0 .
Novedades de Visual Studio 2019 Preview 2
En la Vista previa 2, hemos enviado una versión de vista previa de Lifetime Profile Checker que implementa la versión publicada de Lifetime Profile . Este verificador es parte de los verificadores principales de C ++ en Visual Studio.
- Soporte para iteradores, string_views y spans.
- Mejor detección de los tipos de puntero y propietario personalizados que permite que los tipos personalizados que se comportan como contenedores, punteros propietarios o punteros no propietarios participen en el análisis.
- Las reglas predeterminadas de tipo para condiciones de llamada previa y posterior a la función ayudan a reducir los falsos positivos y mejorar la precisión.
- Mejor soporte para tipos agregados.
- Corrección general y mejoras de rendimiento.
- Algunos análisis simples nullptr.
Habilitación de las reglas del verificador de perfil de por vida
Las reglas del verificador no están habilitadas por defecto. Si desea probar las nuevas reglas, deberá actualizar el conjunto de reglas de análisis de código seleccionado para su proyecto. Puede seleccionar las “Reglas de por vida de C ++ Core Check”, que habilita solo las reglas del Perfil de por vida, o puede modificar su conjunto de reglas existente para habilitar las advertencias 26486 a 26489.

Captura de pantalla de la página de propiedades de Análisis de código que muestra el conjunto de reglas de C ++ Core Check Lifetime Rules seleccionado.
Las advertencias aparecerán en la Lista de errores cuando se ejecute el análisis de código (Analizar> Ejecutar análisis de código), o si tiene habilitado el Análisis de código de fondo, los errores de por vida se mostrarán en el editor con garabatos verdes.

Captura de pantalla que muestra una advertencia de Lifetime Profile Checker con un garabato verde en el código fuente.
Ejemplos
Puntero colgando
El ejemplo más simple, usar un puntero colgante, es el mejor lugar para comenzar. Aquí px
apunta a x
y luego x
deja el alcance dejando px
colgando. Cuando se utiliza px
, se emite una advertencia.
void simple_test() { int* px; { int x = 0; px = &x; } *px = 1;
Puntero de salida colgante
Tampoco se permite devolver punteros colgantes. En este caso, se presume que el parámetro ppx
es un parámetro de salida. En este caso, está configurado para apuntar a x
que queda fuera de alcance al final de la función. Esto deja *ppx
colgando.
void out_parameter(int x, int** ppx)
Vista de cuerdas colgantes
Los dos últimos ejemplos fueron obvios, pero las instancias temporales pueden introducir errores sutiles. ¿Puedes encontrar el error en el siguiente código?
std::string get_string(); void dangling_string_view() { std::string_view sv = get_string(); auto c = sv.at(0); }
En este caso, la vista de cadena sv
se construye con la instancia de cadena temporal devuelta por get_string()
. La cadena temporal se destruye, lo que deja la vista de cadena haciendo referencia a un objeto no válido.
Iterador colgando
Otro problema difícil de detectar ocurre cuando se usa un iterador invalidado en un contenedor. En el siguiente caso, la llamada a push_back
puede hacer que el vector reasigne su almacenamiento subyacente, lo que invalida el iterador.
void dangling_iterator() { std::vector<int> v = { 1, 2, 3 }; auto it = v.begin(); *it = 0;
Una cosa a tener en cuenta sobre este ejemplo es que no hay un manejo especial para 'std :: vector :: push_back'. Este comportamiento cae fuera de las reglas de perfil predeterminadas. Una regla clasifica los contenedores como 'Propietario'. Luego, cuando se llama a un método no constante en el Propietario, se supone que su memoria propia está invalidada y los iteradores que apuntan a la memoria propia también se consideran inválidos.
Propietario modificado
El perfil es prescriptivo en su orientación. Espera que su código utilice el sistema de tipos de forma idiomática al definir los parámetros de la función. En el siguiente ejemplo, std::unique_ptr
, un tipo 'Propietario', se pasa a otra función por referencia no constante. De acuerdo con las reglas del perfil, se supone que el titular de la llamada modifica a los propietarios que pasan por referencia no constante.
void use_unique_ptr(std::unique_ptr<int>& upRef); void assumes_modification() { auto unique = std::make_unique<int>(0);
En este ejemplo, obtenemos un puntero en bruto, ptr
, a la memoria propiedad de unique
. Luego se pasa unique
a la función use_unique_ptr
por referencia no constante. Debido a que este es un uso no const de unique
donde la función podría hacer cualquier cosa, el análisis asume que unique
'se invalida de alguna manera (por ejemplo, unique_ptr :: reset) lo que causaría que ptr
cuelgue.
Más ejemplos
Hay muchos otros casos que el análisis puede detectar. Pruébelo en Visual Studio con su propio código y vea lo que encuentra. Consulte también el blog de Herb para obtener más ejemplos y, si tiene curiosidad, lea el documento de Lifetime Profile.
Problemas conocidos
La implementación actual no es totalmente compatible con el análisis como se describe en el documento de Lifetime Profile. Estas son las categorías generales que no se implementan en esta versión.
Concluir
Pruebe el Verificador de perfil de por vida en Visual Studio 2019 Preview 2. Esperamos que ayude a identificar problemas de por vida en sus proyectos. Si encuentra falsos positivos o falsos negativos, infórmelos para que podamos priorizar los escenarios que son importantes para usted. Si tiene sugerencias o problemas con esta verificación, o con cualquier función de Visual Studio, informe un problema o publíquelo en la comunidad de desarrolladores y avísenos. También estamos en Twitter en @VisualC .