C6401
Ostrzeżenie C6401: użycie <function name> dla domyślnych ustawień lokalnych, w celu wykonania porównania, nie uwzględniającego wielkości liter, ze stałym ciągiem <string name>.Daje nieoczekiwane wyniki w ustawieniach lokalnych innych niż angielski
To ostrzeżenie wskazuje, że porównanie stałego ciągu, bez uwzględniania wielkości liter, jest wykonywane podczas określania domyślnych ustawień lokalnych; najwyraźniej miało zostać wykonane porównanie niezależne od ustawień regionalnych.
Typową konsekwencją tej wady jest nieprawidłowe zachowanie ustawień regionalnych innych niż angielskie.Na przykład w tureckim ".gif" będzie niezgodne z ".GIF"; w języku wietnamskim "LogIn" będzie niezgodne z "LOGIN".
Funkcja CompareString przyjmuje ustawienia regionalne jako argument; jednakże, przekazanie domyślnych ustawień regionalnych, na przykład stałej LOCALE_USER_DEFAULT, spowoduje różne zachowania w różnych lokalizacjach, w zależności od użytkownika domyślnego.Zazwyczaj porównania nieuwzględniające wielkości liter przeciwko stałemu ciągowi powinno być przeprowadzone za pomocą porównania niezależnego od ustawień regionalnych.
Aby wykonać porównanie niezależne od ustawień regionalnych używając CompareString w systemie Windows XP, pierwszy parametr powinien być stałą LOCALE_INVARIANT; na przykład, aby wykonać test niezależny od ustawień regionalnych dla pString, czy jest dopasowany do file1.gif, ignorując różnice w wielkich/małych literach, należy użyć wywołania, takiego jak:
CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
pString,
-1,
TEXT("file1.gif"),
-1) == CSTR_EQUAL
Przykład
Poniższy kod generuje to ostrzeżenie:
include <windows.h>
int fd(char *ext)
{
return (CompareString(LOCALE_USER_DEFAULT,
NORM_IGNORECASE,
ext,
-1,
TEXT("gif"),
-1) == 2);
}
Aby poprawić to ostrzeżenie, należy użyć następującego kodu:
include <windows.h>
int f(char *ext)
{
return (CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
ext,
-1,
TEXT("gif"),
-1) == 2);
}