From stdcxx-dev-return-3621-apmail-incubator-stdcxx-dev-archive=incubator.apache.org@incubator.apache.org Mon Jun 04 23:48:52 2007 Return-Path: Delivered-To: apmail-incubator-stdcxx-dev-archive@www.apache.org Received: (qmail 4105 invoked from network); 4 Jun 2007 23:48:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 4 Jun 2007 23:48:46 -0000 Received: (qmail 39843 invoked by uid 500); 4 Jun 2007 23:48:50 -0000 Delivered-To: apmail-incubator-stdcxx-dev-archive@incubator.apache.org Received: (qmail 39831 invoked by uid 500); 4 Jun 2007 23:48:50 -0000 Mailing-List: contact stdcxx-dev-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: stdcxx-dev@incubator.apache.org Delivered-To: mailing list stdcxx-dev@incubator.apache.org Received: (qmail 39820 invoked by uid 99); 4 Jun 2007 23:48:50 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Jun 2007 16:48:50 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO brutus.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Jun 2007 16:48:46 -0700 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id DE64B4297CB for ; Mon, 4 Jun 2007 16:48:25 -0700 (PDT) Message-ID: <26571958.1181000905906.JavaMail.jira@brutus> Date: Mon, 4 Jun 2007 16:48:25 -0700 (PDT) From: "Martin Sebor (JIRA)" To: stdcxx-dev@incubator.apache.org Subject: [jira] Commented: (STDCXX-435) [Linux] std::codecvt_byname("*.UTF-8").in() to_next greater than expected In-Reply-To: <30390659.1180932915594.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/STDCXX-435?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12501407 ] Martin Sebor commented on STDCXX-435: ------------------------------------- The problem seems to be caused by the fact that in libc mode (i.e., when using the underlying C library) codecvt_byname calls (via __rw_libc_do_in) mbsrtowcs() to convert the source sequence without bothering to make sure it's NUL-terminated. The function attempts to convert the source sequence up until the terminating NUL (or an invalid byte) or until it has produced the requested number of destitation characters. When the destination buffer is large enough for more the number of characters in the source sequence the function just keeps converting past the end. > [Linux] std::codecvt_byname("*.UTF-8").in() to_next greater than expected > ------------------------------------------------------------------------- > > Key: STDCXX-435 > URL: https://issues.apache.org/jira/browse/STDCXX-435 > Project: C++ Standard Library > Issue Type: Bug > Components: 22. Localization > Affects Versions: 4.1.3 > Environment: gcc version 4.1.1 20070105 (Red Hat 4.1.1-51) > Reporter: Mark Brown > > When compiled with gcc 4.1.1 on Linux the program below runs successfully to completion as it should. When compiled with stdcxx the facet returns a to_next value that is greater than the number of internal (wchar_t) characters actually produced by the conversion and consequently the program aborts. > $ cat t.cpp && make t && ./t > #include > #include > #include > int main () > { > const std::locale utf8 ("en_US.UTF-8"); > typedef std::codecvt UTF8_Cvt; > const UTF8_Cvt &cvt = std::use_facet(utf8); > const char src[] = "abc"; > wchar_t dst [2] = { L'\0' }; > const char* from_next; > wchar_t* to_next; > std::mbstate_t state = std::mbstate_t (); > const std::codecvt_base::result res = > cvt.in (state, > src, src + 1, from_next, > dst, dst + 2, to_next); > assert (1 == from_next - src); > assert (1 == to_next - dst); > assert ('a' == dst [0]); > } > gcc -c -I/home/mbrown/stdcxx/include/ansi -D_RWSTDDEBUG -I/home/mbrown/stdcxx/include -I/build/mbrown/stdcxx-gcc-4.1.1-11S/include -I/home/mbrown/stdcxx/examples/include -pedantic -nostdinc++ -g -W -Wall -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long -Wcast-align t.cpp > t.cpp: In function 'int main()': > t.cpp:21: warning: unused variable 'res' > gcc t.o -o t -L/build/mbrown/stdcxx-gcc-4.1.1-11S/lib -lstd11S -lsupc++ -lm > t: t.cpp:26: int main(): Assertion `1 == from_next - src' failed. > Aborted -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.