Avviso C28750

Utilizzo vietato di lstrlen e delle relative varianti: '*function-name' è un'API vietata per migliorare la gestione degli errori.

Questo avviso indica che viene usata una funzione che è stata vietata e ha una sostituzione più affidabile o sicura. Questo errore specifico indica l'utilizzo di lstrlen o una variante.

Commenti

La funzione lstrlen e le relative varianti vengono vietate perché non riescono a trasmettere eccezioni. Ciò può causare l'esecuzione di condizioni di errore molto più tardi, potenzialmente in un thread diverso. Ciò rende più difficile diagnosticare le condizioni di errore. Inoltre, le funzioni di sostituzione equivalenti possono essere ottimizzate dal compilatore ed evitare il sovraccarico delle prestazioni dei gestori di eccezioni (__try e blocchi di __except).

La mitigazione corretta consiste nell'usare una funzione di lunghezza stringa più sicura (in genere strlen, wcslen, _tcslen). Tuttavia, mentre si esaminano le modifiche di lstrlen, è necessario verificare che il buffer stringa proviene da codice attendibile. Se si gestiscono dati non attendibili, è invece necessario passare dalla famiglia strlen di funzioni alla famiglia strnlen (o stringaCchLength famiglia), che garantisce che non vadano oltre i limiti del blocco di dati non attendibile.

Si noti che a differenza di lstrlen, nessuno dei sostituzioni rileva eccezioni. Inoltre, lstrlen gestisce i puntatori NULL mentre le sostituzioni non sono necessarie, quindi è necessario un controllo NULL esplicito quando si sostituisce lstrlen con strlen o strnlen (se i puntatori NULL sono possibili a quel punto nel codice).

Un elenco di tutte le funzioni vietate descritte da questo errore e le sostituzioni consigliate (sia per i dati attendibili che non attendibili) sono disponibili dopo l'esempio seguente.

Nome analisi del codice: BANNED_API_USAGE_LSTRLEN

Esempio

Il codice seguente genera questo avviso:

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

Ciò è dovuto all'uso della funzione unsafe lstrlen. Per risolvere questo problema, è possibile usare strlen come sostituzione, assicurarsi di verificare se il puntatore è NULL:

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

Funzioni vietate

API vietata Sostituzione dei dati attendibili Sostituzioni dei dati non attendibili
lstrlen _tcslen _tcsnlen, StringCchLength
lstrlenA strlen strnlen, StringCchLengthA
lstrlenW wcslen wcsnlen, StringCchLengthW