Advertencia C28750

Uso prohibido de lstrlen y sus variantes: '*function-name' es una API prohibida para mejorar el control de errores.

Esta advertencia indica que se está usando una función que se ha prohibido y tiene un reemplazo más sólido o seguro. Este error específico indica el uso de lstrlen o una variante de este.

Comentarios

La función lstrlen y sus variantes están prohibidas porque no transmiten excepciones. Esto puede hacer que se produzcan condiciones de error mucho más adelante, potencialmente en un subproceso diferente. Esto dificulta el diagnóstico de las condiciones de error. Además, el compilador puede optimizar las funciones de sustitución equivalentes y evitar la sobrecarga de rendimiento de los controladores de excepciones (bloques __try y __except).

La mitigación correcta es usar una función de longitud de cadena más segura (normalmente strlen, wcslen, _tcslen). Sin embargo, mientras revisa los cambios de lstrlen, debe confirmar que el búfer de cadenas procede del código de confianza. Si trabaja con datos que no son de confianza, debe cambiar de la familia strlen de funciones a la familia strnlen (o a la familia StringCchLength), lo que garantizará que no pasen los límites del bloque de datos que no es de confianza.

Tenga en cuenta que, a diferencia de lstrlen, ninguno de los reemplazos detecta excepciones. Además, lstrlen controla punteros NULL mientras que los reemplazos no, por lo que se requiere una comprobación DE NULL explícita al reemplazar lstrlen por strlen o strnlen (si los punteros NULL son posibles en ese punto del código).

Se puede encontrar una lista de todas las funciones prohibidas cubiertas por este error y los reemplazos recomendados (tanto para datos de confianza como que no son de confianza) después del ejemplo siguiente.

Nombre del análisis de código: BANNED_API_USAGE_LSTRLEN

Ejemplo

El código siguiente genera esta advertencia:

int example_func(char* in)
{ 
    int size = lstrlen(in);
    return size; 
} 

Esto se debe al uso de la función no segura lstrlen. Para corregir este problema, podemos usar strlen como reemplazo, asegurándose de comprobar si el puntero es NULL:

int example_func(char* in) 
{ 
    if (in != NULL) {
        int size = strlen(in);
        return size;
    }
    else {
        // handle error.
    }
} 

Funciones prohibidas

API prohibida Reemplazos de datos de confianza Reemplazos de datos que no son de confianza
lstrlen _tcslen _tcsnlen, StringCchLength
lstrlenA strlen strnlen, StringCchLengthA
lstrlenW wcslen wcsnlen, StringCchLengthW