Ten kod wydawał się działać poprawnie w (ubuntu trusty) wersjach gcc i clang, aw Win 7 na VM za pośrednictwem mingw ... Niedawno uaktualniłem do Wily i kompilacje wykonane z klang crash konsekwentnie tutaj.Czy ten prosty program w języku C++ używający poprawki <locale> jest poprawny?
#include <iostream>
#include <locale>
#include <string>
int main() {
std::cout << "The locale is '" << std::locale("").name() << "'" << std::endl;
}
Czasami Jego bełkot ciąg następnie Aborted: Core dumped
a czasami także jej invalid free
.
$ ./a.out
The locale is 'en_US.UTF-8QX�у�X�у����0�����P�����\�(��\�(��\�(��h��t�������������y���������ț�ԛ�������en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_UP����`�������������������������p�����������@��������������`�������������p��������������������@��@��@��`��������p������������0��P��p���qp��!en_US.UTF-8QЈ[�����\�(��\�(��\�(�����������@�� �����P�����0�����P�����\�(��\�(��\�(��Ȣ�Ԣ����������������(��4��@��L��en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8!�v[��������������@�� �����P�����0�����P�����\�(��\�(���(��h��t��������������������Ȥ�Ԥ�������en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8!��[�� ����[�������7����7��.,!!x�[��!��[��!�[��@�����������@�� �����P�����0�����P�����\�(��\�(��\�(��(��4��@��L��X��d��p��|������������n_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8ѻAborted (core dumped)
$ ./a.out
The locale is 'en_US.UTF-8QX\%�QX\%�Q�G�0H��H�PI��I�\:|�Q\D|�Q\>|�QhK�tK��K��K��K��K��Q�K��K��K��K��K��K�en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8ѻ
*** Error in `./a.out': free(): invalid pointer: 0x0000000000b04a98 ***
Aborted (core dumped)
(Oba wyjścia programu powyżej zostały znacznie skrócone lub nie pasuje w tej kwestii).
ja też dostałem invalid free on Coliru z nim również.
Ale to jest bardzo podobny do przykładu kodu na cppreference:
#include <iostream>
#include <locale>
#include <string>
int main()
{
std::wcout << "User-preferred locale setting is " << std::locale("").name().c_str() << '\n';
// on startup, the global locale is the "C" locale
std::wcout << 1000.01 << '\n';
// replace the C++ global locale as well as the C locale with the user-preferred locale
std::locale::global(std::locale(""));
// use the new global locale for future wide character output
std::wcout.imbue(std::locale());
// output the same number again
std::wcout << 1000.01 << '\n';
}
Właściwie że kod crashes Coliru również ...: facepalm:
Morecrashes podobnego kodu z Coliru.
Czy jest to błąd w bibliotece C++ używanej przez clang, czy ten kod jest wadliwy?
Uwaga: te awarie wydają się być ograniczone do interfejsu API w C++, jeśli użyjesz <clocale>
zamiast tego, wydaje się, że wszystko działa dobrze, więc może to być po prostu banalny problem związany z powiązaniami C++?
Wariacje wykorzystujące setlocale
: 123
Wygląda całkiem jak błąd dla mnie. Czy rozważałeś zadawanie listy mailingowej i/lub zgłaszanie jej jako błędu? Wydaje się, że bardziej odpowiednie miejsce do pytania ... –
Jeśli clang, kompilator, zawiesza się podczas kompilowania tego kodu, to jest to błąd klang, który powinien zostać zgłoszony. –
@LightnessRacesinOrbit: Tak, myślę, że to jest następny krok. –