Partager via


Avertissement C28750

Utilisation interdite de lstrlen et de ses variantes : « *function-name » est une API interdite à des fins de gestion des erreurs améliorées.

Cet avertissement indique qu’une fonction qui a été interdite est utilisée et qu’elle a un remplacement plus robuste ou plus sécurisé. Cette erreur spécifique indique l’utilisation de lstrlen ou d’une variante de celui-ci.

Remarques

La fonction lstrlen et ses variantes sont interdites, car elles ne parviennent pas à transmettre les exceptions. Cela peut entraîner des conditions d’erreur beaucoup plus tard, potentiellement sur un autre thread. Cela rend les conditions d’erreur plus difficiles à diagnostiquer. En outre, les fonctions de substitution équivalentes peuvent être optimisées par le compilateur et éviter la surcharge de performances des gestionnaires d’exceptions (__try et __except blocs).

La bonne atténuation consiste à utiliser une fonction de longueur de chaîne plus sûre (généralement strlen, wcslen, _tcslen). Toutefois, pendant que vous passez en revue les modifications de lstrlen, vous devez vérifier que la mémoire tampon de chaîne provient de code approuvé. Si vous traitez des données non approuvées, vous devez plutôt passer de la famille strlen de fonctions à la famille strnlen (ou à la famille StringCchLength), ce qui garantit qu’elles ne dépassent pas les limites du bloc de données non approuvé.

Notez que contrairement à lstrlen, aucun remplacement n’intercepte les exceptions. En outre, lstrlen gère les pointeurs NULL alors que les remplacements ne le font pas, une case activée NULL explicite est donc requise lors du remplacement de lstrlen par strlen ou strnlen (si des pointeurs NULL sont possibles à ce point dans le code).

Une liste de toutes les fonctions interdites couvertes par cette erreur et les remplacements recommandés (pour les données approuvées et non approuvées) est disponible dans l’exemple suivant.

Nom de l’analyse du code : BANNED_API_USAGE_LSTRLEN

Exemple

Le code suivant génère cet avertissement :

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

Cela est dû à l’utilisation de la fonction non sécurisée lstrlen. Pour résoudre ce problème, nous pouvons utiliser strlen comme remplacement, en veillant à case activée si le pointeur a la valeur NULL :

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

Fonctions interdites

API interdite Remplacement(s) de données approuvées Remplacement(s) de données non approuvées
lstrlen _tcslen _tcsnlen, StringCchLength
lstrlenA strlen strnlen, StringCchLengthA
lstrlenW wcslen wcsnlen, StringCchLengthW