You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stdcxx.apache.org by "Martin Sebor (JIRA)" <ji...@apache.org> on 2006/08/27 00:15:22 UTC
[jira] Commented: (STDCXX-280) SIGABRT in codecvt::out()
[ http://issues.apache.org/jira/browse/STDCXX-280?page=comments#action_12430795 ]
Martin Sebor commented on STDCXX-280:
-------------------------------------
Another test case with more detail and stack trace showing that the problem originates in wcsrtombs():
$ cat u.cpp && nice make u && LC_ALL=zh_CN.UTF-8@pinyin gdb -q ./u
#include <cassert>
#include <cwchar>
#include <iostream>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
typedef std::codecvt<wchar_t, char, std::mbstate_t> CodeCvt;
const std::locale loc ("");
const CodeCvt &cvt = std::use_facet<CodeCvt>(loc);
CodeCvt::state_type state = { };
const int pagesize = getpagesize ();
void* const addr =
mmap (0, 2 * pagesize, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
assert (MAP_FAILED != addr);
wchar_t* const from = (wchar_t*)addr + pagesize / sizeof (wchar_t) - 1;
const wchar_t* const from_end = from + 1;
const wchar_t* from_next = 0;
from [0] = L'\n';
from [1] = L'\377';
assert (0 == mprotect (addr, pagesize, PROT_READ));
assert (0 == mprotect (from + 1, pagesize, PROT_NONE));
char to [40];
char* const to_limit = to + sizeof to;
char* to_next = 0;
CodeCvt::result res;
res = cvt.out (state, from, from_end, from_next, to, to_limit, to_next);
assert (cvt.ok == res);
assert (from_next == from_end);
assert (to_next == to + 1);
assert ('\n' == *to);
}
gcc -c -I/build/sebor/dev/stdlib/include/ansi -D_RWSTDDEBUG -D_RWSTD_USE_CONFIG -I/build/sebor/dev/stdlib/include -I/build/sebor/gcc-4.1.0-11s/include -I/build/sebor/dev/stdlib/../rwtest -I/build/sebor/dev/stdlib/../rwtest/include -I/build/sebor/dev/stdlib/tests/include -pedantic -nostdinc++ -g -W -Wall -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long u.cpp
u.cpp: In function 'int main()':
u.cpp:15: warning: missing initializer for member '__mbstate_t::__filler'
gcc u.o -o u -L/build/sebor/gcc-4.1.0-11s/rwtest -lrwtest11s -L/build/sebor/gcc-4.1.0-11s/lib -lstd11s -lsupc++ -lm
(gdb) run
Starting program: /build/sebor/gcc-4.1.0-11s/tests/u
Program received signal SIGSEGV, Segmentation fault.
0xff2533c4 in __wcsrtombs_dense_utf8 ()
from /usr/lib/locale/zh.UTF-8/methods_zh.UTF-8.so.2
(gdb) bt
#0 0xff2533c4 in __wcsrtombs_dense_utf8 ()
from /usr/lib/locale/zh.UTF-8/methods_zh.UTF-8.so.2
#1 0x0005b764 in __rw_libc_do_out (state=@0xffbffa50, from=0xff361ffc,
from_end=0xff362000, from_next=@0xffbffa4c, to=0xffbffa20 "\n",
to_limit=0xffbffa48 " 6\037", to_next=@0xffbffa48)
at /build/sebor/dev/stdlib/src/wcodecvt.cpp:535
#2 0x0005c1f0 in std::codecvt_byname<wchar_t, char, __mbstate_t>::do_out (
this=0xce370, state=@0xffbffa50, from=0xff361ffc, from_end=0xff362000,
from_next=@0xffbffa4c, to=0xffbffa20 "\n",
to_limit=0xffbffa48 " 6\037", to_next=@0xffbffa48)
at /build/sebor/dev/stdlib/src/wcodecvt.cpp:1583
#3 0x0001259c in std::codecvt<wchar_t, char, __mbstate_t>::out (this=0xce370,
__state=@0xffbffa50, __from=0xff361ffc, __from_end=0xff362000,
__from_next=@0xffbffa4c, __to=0xffbffa20 "\n",
__to_limit=0xffbffa48 " 6\037", __to_next=@0xffbffa48)
at _codecvt.h:342
#4 0x0001241c in main () at u.cpp:42
> SIGABRT in codecvt::out()
> -------------------------
>
> Key: STDCXX-280
> URL: http://issues.apache.org/jira/browse/STDCXX-280
> Project: C++ Standard Library
> Issue Type: Bug
> Components: 22. Localization
> Affects Versions: 4.1.2, 4.1.3
> Environment: all
> Reporter: Martin Sebor
> Priority: Critical
>
> The program below aborts on Solaris 9:
> $ cat u.cpp && make u && LC_ALL=zh_CN.UTF-8@pinyin ./u
> #include <cassert>
> #include <cwchar>
> #include <iostream>
> int main ()
> {
> typedef std::codecvt<wchar_t, char, std::mbstate_t> CodeCvt;
> const std::locale loc ("");
> const CodeCvt &cvt = std::use_facet<CodeCvt>(loc);
> CodeCvt::state_type state = { };
> const wchar_t* const from = L"\n\377";
> const wchar_t* const from_end = from + 1;
> const wchar_t* from_next = 0;
> char to [40];
> char* const to_limit = to + sizeof to;
> char* to_next = 0;
> CodeCvt::result res;
> res = cvt.out (state, from, from_end, from_next, to, to_limit, to_next);
> assert (cvt.ok == res);
> assert (from_next == from_end);
> assert (to_next == to + 1);
> assert ('\n' == *to);
> }
> gcc -c -I/build/sebor/dev/stdlib/include/ansi -D_RWSTDDEBUG -D_RWSTD_USE_CONFIG -I/build/sebor/dev/stdlib/include -I/build/sebor/gcc-4.1.0-11s/include -I/build/sebor/dev/stdlib/../rwtest -I/build/sebor/dev/stdlib/../rwtest/include -I/build/sebor/dev/stdlib/tests/include -pedantic -nostdinc++ -g -W -Wall -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long u.cpp
> u.cpp: In function 'int main()':
> u.cpp:11: warning: missing initializer for member '__mbstate_t::__filler'
> gcc u.o -o u -L/build/sebor/gcc-4.1.0-11s/rwtest -lrwtest11s -L/build/sebor/gcc-4.1.0-11s/lib -lstd11s -lsupc++ -lm
> /build/sebor/dev/stdlib/src/wcodecvt.cpp:496: std::codecvt_base::result __rw::__rw_libc_do_out(__mbstate_t&, const wchar_t*, const wchar_t*, const wchar_t*&, char*, char*, char*&): Assertion 'from_next <= from_end' failed.
> Segmentation Fault (core dumped)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira