[jira] [Updated] (STDCXX-1057) attempting to create a std::string of size 65535 or greater fails with Perennial CPPVS V8.1

2012-02-06 Thread Farid Zaripov (Updated) (JIRA)

 [ 
https://issues.apache.org/jira/browse/STDCXX-1057?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Farid Zaripov updated STDCXX-1057:
--

Comment: was deleted

(was: Could not reproduce on MSVC 10 with stdcxx 4.2.1 and 4.2.2)

 attempting to create a std::string of size 65535 or greater fails with 
 Perennial CPPVS V8.1
 ---

 Key: STDCXX-1057
 URL: https://issues.apache.org/jira/browse/STDCXX-1057
 Project: C++ Standard Library
  Issue Type: Bug
  Components: 21. Strings
Affects Versions: 4.2.1, 4.2.x, 4.3.x, 5.0.0
 Environment: Solaris 10 and 11, RedHat Linux, OpenSuSE Linux
 SUN C++ Compilers 12.1, 12.2, 12.3
 Defect is independent of compiler and platform
Reporter: Stefan Teleman
  Labels: conformance, features, standards, test
 Fix For: 4.2.x, 4.3.x, 5.0.0

 Attachments: stdcxx-1057.patch, test.cc


 in member function:
 size_type basic_string_CharT, _Traits, _Allocator::max_size();
 the maximum size of a basic_string is restricted to less than 65535 bytes.
 The Standard is ambiguous as to what the max_size() of a std::string should
 actually be (see LWG Core Issue 197). However, less than 65535 bytes for
 the max_size of a std::string is rather small. GNU libstdc++ and stlport4
 set std::string::max_size to (SIZE_MAX / 4) (i.e. 1GB). Solaris sets it
 to SIZE_MAX.
 Perennial CPPVS explicitly tests for the creation of a std::string of size
 greater than 65535. In the current stdcxx implementation, this test fails.
 The max_size of a std::string should be significantly greater than 65535 
 bytes.
 Test to reproduce the defect:
 {code:title=test.cc|borderStyle=solid}
 #include iostream
 #include string
 const size_t maxlen = 65536U;
 char array[maxlen];
 struct test_traits : public std::char_traitschar
 { };
 templateclass T
 struct test_alloc : public std::allocatorT
 {
 typedef typename std::allocatorT::size_type size_type;
 templateclass Y
 struct rebind
 {
 typedef test_allocY other;
 };
 test_alloc() throw() { }
 test_alloc(const test_alloc rhs) throw() { }
 templateclass Y
 test_alloc(const test_allocY y) throw() { }
 ~test_alloc() throw() { }
 size_type max_size() const throw() { return maxlen; }
 };
 int main()
 {
 typedef
 std::basic_stringchar, test_traits, test_allocchar  test_string;
 int ret = 0;
 size_t i, j;
 for (i = 0; i  maxlen; i++)
 array[i] = '*';
 array[maxlen - 1] = '\0';
 for (i = 0; i  maxlen - 1; i+= 8)
 {
 array[i] = '\0';
 test_string s(array);
 j = s.size();
 array[i] = '-';
 if (i != j)
 {
 std::cerr  i =   i   j =   j   expected i == j
std::endl;
 ret = 1;
 break;
 }
 }
 return ret;
 }
 {code}
 1. Output from GCC 4.5.0:
 {noformat}
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:16:34][2162] ./test-gcc
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:16:48][2163] echo $status
 0
 {noformat}
 2. Output from Sun C++ 12.2 with stlport:
 {noformat}
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:16:50][2164] ./test-ss122-stlport 
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:16:58][2165] echo $status
 0
 {noformat}
 3. Output from Sun C++ 12.2 with our patched stdcxx:
 {noformat}
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:17:00][2166] ./test-ss122-stdcxx 
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:17:06][2167] echo $status
 0
 {noformat}
 4. Output from Pathscale 4.0.12.1 (which did not patch stdcxx):
 {noformat}
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:17:08][2168] ./test-pathscale 
 Terminating due to uncaught exception 0x614240 of type std::length_error
 Abort (core dumped)
 [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/6889771][02/06/2012
  10:17:13][2169] echo $status
 134
 {noformat}
 Patch for 4.2.1 to follow shortly.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira




[jira] [Updated] (STDCXX-1058) std::basic_ios::copyfmt() with registered callback (via std::ios_base::register_callback()) run-time SIGABRT

2012-02-05 Thread Farid Zaripov (Updated) (JIRA)

 [ 
https://issues.apache.org/jira/browse/STDCXX-1058?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Farid Zaripov updated STDCXX-1058:
--

Description: 
A stream with a registered callback via register_callback() SIGABRTs at 
run-time:

{code}
#include iostream
#include fstream

int x;

void testfun (std::ios_base::event ev, std::ios_base iosobj, int index)
{
  x = index;

  switch (ev)
  {
case std::ios_base::copyfmt_event:
  std::cerr  copyfmt_event  std::endl; break;
case std::ios_base::imbue_event:
  std::cerr  imbue_event  std::endl; break;
case std::ios_base::erase_event:
  std::cerr  erase_event  std::endl; break;
default:
  std::cerr  unknown  std::endl; break;
  }
}

int main ()
{
  std::fstream f0;
  std::fstream f1;
  int i = 101;

  std::ios_base::event_callback e1 = testfun;
  f0.register_callback (e1, i);

  x = 0;
  f0.imbue (std::cerr.getloc());
  if (x != i)
std::cerr  x: expected   i   got   x  std::endl;

  x = 0;
  f0.copyfmt (f1);
  if (x != i)
std::cerr  x: expected   i   got   x  std::endl;

  return 0;
}
{code}

Output from GCC 4.5.0:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/fstream.copyfmt][02/05/2012
 0:32:42][1340] ./test-gcc 
imbue_event
erase_event
{noformat}

Output from Sun C++ 12.2 with stlport4:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/fstream.copyfmt][02/05/2012
 0:32:44][1341] ./test-ss12-stlport 
imbue_event
erase_event
copyfmt_event
erase_event
{noformat}

Output from Sun C++ 12.2 with our stdcxx (patched):
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/fstream.copyfmt][02/05/2012
 0:32:58][1342] ./test-ss12-stdcxx 
imbue_event
erase_event
{noformat}

Output from Pathscale 4.0.12.1 (which didn't patch stdcxx):
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/fstream.copyfmt][02/05/2012
 0:33:03][1343] ./test-pathscale 
imbue_event
erase_event
*** glibc detected *** ./test-pathscale: double free or corruption (fasttop): 
0x 0605480 ***
=== Backtrace: =
/lib64/libc.so.6(+0x73286)[0x7f78cbb7f286]
/lib64/libc.so.6(cfree+0x6c)[0x7f78cbb8402c]
/opt/pathscale/ekopath-4.0.12.1/lib/4.0.12.1/x8664/64/libcxxrt.so(_ZdlPv+0xd)[0x
 f78cc097d63]
/opt/pathscale/ekopath-4.0.12.1/lib/4.0.12.1/x8664/64/libstl.so(_ZNSt8ios_base11
 C_usr_data10_C_deallocEPS0_+0x2d)[0x7f78cc300b5b]
=== Memory map: 
0040-00404000 r-xp  103:00 9582413   
/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/fstream.copyfmt/test-pathscale
00603000-00604000 r--p 3000 103:00 9582413   
/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/fstream.copyfmt/test-pathscale
00604000-00605000 rw-p 4000 103:00 9582413   
/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/fstream.copyfmt/test-pathscale
00605000-00626000 rw-p  00:00 0  [heap]

[ ... ]
{noformat}

I no longer have an unpatched stdcxx handy for the Sun C++ compilers available
to reproduce the defect with the Sun C++ compiler.

Defect is in file src/iostore.cpp, starting at line 275:

_C_usr-_C_iarray, _C_usr-_C_parray and _C_usr-_C_cbarray
are not set to NULL after deletion:

{code}
_TRY {
if (_C_usr) {
// fire erase events (27.4.4.2, p17) - may throw
if (_C_usr-_C_fire)
(this-*_C_usr-_C_fire)(erase_event, true /* reentrant */);

// delete existing arrays, if any; _C_usr will only be deleted
// if `rhs' contains no user data (see below)
operator delete (_C_usr-_C_iarray);
_C_usr-_C_iarray = 0UL; // - !!
operator delete (_C_usr-_C_parray);
_C_usr-_C_parray = 0UL; // - !!
operator delete (_C_usr-_C_cbarray);
_C_usr-_C_cbarray = 0UL; // - !!
}
{code}

Patch for 4.2.1 to follow shortly.


  was:
A stream with a registered callback via register_callback() SIGABRTs at 
run-time:

#include iostream
#include fstream

int x;

void testfun (std::ios_base::event ev, std::ios_base iosobj, int index)
{
  x = index;

  switch (ev)
  {
case std::ios_base::copyfmt_event:
  std::cerr  copyfmt_event  std::endl; break;
case std::ios_base::imbue_event:
  std::cerr  imbue_event  std::endl; break;
case std::ios_base::erase_event:
  std::cerr  erase_event  std::endl; break;
default:
  std::cerr  unknown  std::endl; break;
  }
}

int main ()
{
  std::fstream f0;
  std::fstream f1;
  int i = 101;

  std::ios_base::event_callback e1 = testfun;
  f0.register_callback (e1, i);

  x = 0;
  f0.imbue (std::cerr.getloc());
  if (x != i)
std::cerr  x: expected   i   got   x  std::endl;

  x = 0;
  f0.copyfmt (f1);
  if (x != i)
std::cerr  x: expected   i