C6401
avviso C6401: l'utilizzo di <nome funzione> in impostazioni locali predefinite per eseguire un confronto senza distinzione tra maiuscole e minuscole con la stringa costante <nome stringa> produce risultati imprevisti nelle impostazioni locali diverse dalle inglesi
L'avviso indica che è in esecuzione un confronto senza distinzione tra maiuscole e minuscole con una stringa costante con la specifica delle impostazioni locali predefinite, mentre era previsto un confronto indipendente da tali impostazioni.
La conseguenza tipica di questo errore è il comportamento non corretto in impostazioni locali diverse dalle inglesi. In turco, ad esempio, ".gif" non corrisponderà a ".GIF" e in vietnamita "LogIn" non corrisponderà a "LOGIN".
La funzione CompareString accetta impostazioni locali come argomento. Tuttavia, il passaggio impostazioni locali predefinite, ad esempio la costante LOCALE_USER_DEFAULT, potrà provocare comportamenti diversi nelle diverse impostazioni locali, a seconda dell'impostazione predefinita dell'utente. Solitamente, un confronto senza distinzione tra maiuscole e minuscole con una stringa costante dovrebbe essere eseguito in un confronto indipendente dalle impostazioni locali.
Per eseguire un confronto indipendente dalle impostazioni locali mediante CompareString su Windows XP, come primo parametro è necessario utilizzare la costante LOCALE_INVARIANT. Per eseguire, ad esempio, un test indipendente dalle impostazioni locali per verificare se pString corrisponde a file1.gif ignorando le differenze tra maiuscole e minuscole, utilizzare una chiamata analoga alla seguente:
CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
pString,
-1,
TEXT("file1.gif"),
-1) == CSTR_EQUAL
Esempio
Il codice seguente genera questo avviso:
include <windows.h>
int fd(char *ext)
{
return (CompareString(LOCALE_USER_DEFAULT,
NORM_IGNORECASE,
ext,
-1,
TEXT("gif"),
-1) == 2);
}
Per risolvere il problema, utilizzare il codice seguente:
include <windows.h>
int f(char *ext)
{
return (CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
ext,
-1,
TEXT("gif"),
-1) == 2);
}