[jira] [Created] (STDCXX-1062) std::vectorbool::at() throws the wrong exception

2012-02-16 Thread Stefan Teleman (Created) (JIRA)
std::vectorbool::at() throws the wrong exception
--

 Key: STDCXX-1062
 URL: https://issues.apache.org/jira/browse/STDCXX-1062
 Project: C++ Standard Library
  Issue Type: Bug
  Components: 23. Containers
Affects Versions: 4.2.1, 4.2.x, 4.3.x
 Environment: Solaris 10 and 11
RedHat Linux, OpenSuSE Linux

Defect is independent of platform and/or compiler
Reporter: Stefan Teleman
 Fix For: 4.2.2, 4.2.x, 4.3.x, 5.0.0


The std::vectorbool::at() specialization throws the wrong exception:

{code:title=test.cc|borderStyle=solid}
#include iostream
#include vector
#include stdexcept

static const size_t maxlen = 10;

int main()
{
size_t i;
bool b;
int r;
int ret = 0;
int x = 0;

std::vectorint vi(maxlen, 1);
std::vectorbool vb(maxlen, false);

try
{
r = vi.at (12);
}
catch (std::out_of_range e)
{
std::cerr  std::vectorint::at(12): OK  std::endl;
++x;
}
catch (std::exception e)
{
std::cerr  std::vectorint::at(12): wrong exception: 
 e.what()  std::endl;
++ret;
++x;
}
catch ( ... )
{
std::cerr  std::vectorint::at(12): wrong exception!
 std::endl;
++ret;
++x;
}

try
{
b = vb.at(12);
}
catch (std::out_of_range e)
{
std::cerr  std::vectorbool::at(12): OK  std::endl;
++x;
}
catch (std::exception e)
{
std::cerr  std::vectorbool::at(12): wrong exception: 
 e.what()  std::endl;
++ret;
++x;
}
catch ( ... )
{
std::cerr  std::vectorboolt::at(12): wrong exception!
 std::endl;
++ret;
++x;
}

if (x == 0)

{
std::cerr  no exception was thrown  std::endl;
++ret;
}

return ret;
}
{code}

1. Output from GCC 4.5.0 on OpenSuSE Linux 11.3:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:04][1028] ./test-gcc
std::vectorint::at(12): OK
std::vectorbool::at(12): OK
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:16][1029] echo $status
0
{noformat}

2. Output from SunPro C++ 12.2 with libCstd (default):
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:25][1032] ./test-cstd
std::vectorint::at(12): OK
std::vectorbool::at(12): OK
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:29][1033] echo $status
0
{noformat}

3. Output from Intel C++ 12.10:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:39:33][1053] ./test-icc 
std::vectorint::at(12): OK
std::vectorbool::at(12): OK
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:39:36][1054] echo $status
0
{noformat}

4. Output from SunPro C++ 12.2 with our patched stdcxx:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:31][1034] ./test-stdcxx
std::vectorint::at(12): OK
std::vectorbool::at(12): OK
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:35][1035] echo $status
0
{noformat}

5. Output from Pathscale 4.0.12.1 (which didn't patch stdcxx):
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:37][1036] ./test-pathscale
std::vectorint::at(12): OK
std::vectorbool::at(12): wrong exception: 
/opt/pathscale/ekopath-4.0.12.1/include/4.0.12.1/stl/vector:1236: 
std::vectorbool, _Allocator::reference std::vectorbool, 
_Allocator::at(typename _Allocator::size_type) [with _Allocator = 
std::allocatorbool]: length error: size 12 out of range [0, 10)
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/vector.bool][02/16/2012
 15:37:42][1037] echo $status
1
{noformat}



--
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] [Created] (STDCXX-1061) std::valarray::operator () produces wrong result

2012-02-08 Thread Stefan Teleman (Created) (JIRA)
std::valarray::operator () produces wrong result


 Key: STDCXX-1061
 URL: https://issues.apache.org/jira/browse/STDCXX-1061
 Project: C++ Standard Library
  Issue Type: Bug
  Components: 23. Containers
Affects Versions: 4.2.1
 Environment: Solaris 10 and 11
Red Hat Linux
OpenSuSE Linux
SunPro C++ 12.1, 12.2, 12.3

Defect is independent of platform and/or compiler.

Reporter: Stefan Teleman
 Fix For: 4.2.x, 4.3.x, 5.0.0
 Attachments: stdcxx-1061.patch

std::valarray::operator () produces wrong result:

{code:title=test.cc|borderStyle=solid}
#include iostream
#include valarray

static const size_t maxlen = 10;

void print(const std::valarraybool v)
{
for (size_t i = 0; i  maxlen; ++i)
std::cerr  v[i]   ;
std::cerr  std::endl;
}

int main()
{
int nonzero[maxlen] = { 0, 1, 0, 3, 0, -5, 0, -7, 0, -11 };
int one = 1;
int ret = 0;
size_t i;

std::valarrayint v0 (nonzero, maxlen);
std::valarraybool v3 (maxlen);

for (i = 0; i  maxlen; i++)
v3[i] = nonzero[i]  one;

std::valarraybool v1 = std::operator (v0, one);

for (i = 0; i  maxlen; i++)
{
if ((nonzero[i]  one) != v1[i])
ret = 1;
}

if (ret)
{
std::cerr  expected: ;
print (v3);
std::cerr  got: ;
print (v1);
}

return ret;
}
{code}

1. Output from GCC 4.5.0:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:22:47][2463] ./v-gcc
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:23:01][2464] echo $status
0
{noformat}

2. Output from SunPro C++ 12.2 with stlport4:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:23:02][2465] ./v-ss122-stlport
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:23:08][2466] echo $status
0
{noformat}

3. Output from SunPro C++ 12.2 with our patched stdcxx:
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:23:10][2467] ./v-ss122-stdcxx
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:23:18][2468] echo $status
0
{noformat}

4. Output from Pathscale 4.0.12.1 (which didn't patch stdcxx):
{noformat}
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:23:20][2469] ./v-pathscale
expected: 0 1 0 1 0 1 0 1 0 1 
got: 0 1 0 0 0 0 0 0 0 0 
[steleman@darthvader][/src/steleman/programming/stdcxx-ss122/bugfixes-sunw/nothrow][02/08/2012
 13:23:24][2470] echo $status
1
{noformat}

Patch for stdcxx 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] [Created] (STDCXX-1055) some of the localization class declarations do not follow the ISO/IEC:14882:2003 specification

2012-02-04 Thread Stefan Teleman (Created) (JIRA)
some of the localization class declarations do not follow the 
ISO/IEC:14882:2003 specification
--

 Key: STDCXX-1055
 URL: https://issues.apache.org/jira/browse/STDCXX-1055
 Project: C++ Standard Library
  Issue Type: Bug
  Components: 22. Localization
Affects Versions: 4.2.1, 4.2.2, 4.2.x, 4.3.x, 5.0.0
 Environment: Solaris 10 and 11, Linux (RedHat and OpenSUSE), Sun C++ 
Compiler 12.1, 12.2, 12.3, GCC4.
The defect is independent of platform or compiler.
Reporter: Stefan Teleman
 Fix For: 4.2.x, 4.3.x, 5.0.0


For the following classes:

std::codecvt and its specializations
std::collate and its specializations
std::ctype and its specializations
std::ctype_byname and its specializations
std::messages and its specializations
std::messages_byname and its specializations
std::money_get and its specializations
std::moneypunct and is specializations
std::moneypunct_byname and its specializations
std::money_put and its specializations
std::num_get and its specializations
std::numpunct and its specializations
std::numpunct_byname and its specializations
std::num_put and its specializations
std::time_get and its specializations
std::time_get_byname and its specializations
std::time_put and its specializations

1. all these type declarations must be of class type (and not of struct type)
2. all these classes must have protected virtual destructors
3. all the corresponding *_base (time_base, money_base, etc), must have virtual 
destructors

The current implementation of these types as structs (with default public access
specifier on their non-virtual destructors) causes failures in Perennial CPPVS 
V8.1.

Changing the access specifier for these destructors requires some changes in the
stdcxx tests for localization.

Patch based on 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] [Created] (STDCXX-1056) std::moneypunct and std::numpunct implementations are not thread-safe

2012-02-04 Thread Stefan Teleman (Created) (JIRA)
std::moneypunct and std::numpunct implementations are not thread-safe
-

 Key: STDCXX-1056
 URL: https://issues.apache.org/jira/browse/STDCXX-1056
 Project: C++ Standard Library
  Issue Type: Bug
  Components: 22. Localization
Affects Versions: 4.2.1, 4.2.x, 4.3.x, 5.0.0
 Environment: Solaris 10 and 11, RedHat and OpenSuSE Linux, Sun C++ 
Compilers 12.1, 12.2, 12.3
Issue is independent of platform and/or compiler.
Reporter: Stefan Teleman
 Fix For: 4.2.x, 4.3.x, 5.0.0


several member functions in std::moneypunct and std::numpunct return
a std::string by value (as required by the Standard). The implication of 
return-by-value
being that the caller owns the returned object.

In the stdcxx implementation, the std::basic_string copy constructor uses a 
shared
underlying buffer implementation. This shared buffer creates the first problem 
for
these classes: although the std::string object returned by value *appears* to 
be owned
by the caller, it is, in fact, not.

In a mult-threaded environment, this underlying shared buffer can be 
subsequently modified by a different thread than the one who made the initial 
call. Furthermore, two or more different threads can access the same shared 
buffer at the same time, and modify it, resulting in undefined run-time 
behavior.

The cure for this defect has two parts:

1. the member functions in question must truly return a copy by avoiding a call 
to the copy constructor, and using a constructor which creates a deep copy of 
the std::string.

2. access to these member functions must be serialized, in order to guarantee 
atomicity
of the creation of the std::string being returned by value.

Patch for 4.2.1 to follow.


--
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] [Created] (STDCXX-1057) attempting to create a std::string of size 65535 or greater fails with Perennial CPPVS V8.1

2012-02-04 Thread Stefan Teleman (Created) (JIRA)
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
 Fix For: 4.2.x, 4.3.x, 5.0.0


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.

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] [Created] (STDCXX-1058) std::basic_ios::copyfmt() with registered callback (via std::ios_base::register_callback()) run-time SIGABRT

2012-02-04 Thread Stefan Teleman (Created) (JIRA)
std::basic_ios::copyfmt() with registered callback (via 
std::ios_base::register_callback()) run-time SIGABRT 
---

 Key: STDCXX-1058
 URL: https://issues.apache.org/jira/browse/STDCXX-1058
 Project: C++ Standard Library
  Issue Type: Bug
  Components: 27. Input/Output
Affects Versions: 4.2.1, 4.2.x, 4.3.x, 5.0.0
 Environment: Solaris 10 and 11, Red Hat Linux, OpenSuSE Linux
Sun C++ Compilers 12.1, 12.2, 12.3

Defect is independent of platform or compiler.

Reporter: Stefan Teleman
 Fix For: 4.2.x, 4.3.x, 5.0.0


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   got   x  std::endl;

  return 0;
}

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

Output from Sun C++ 12.2 with stlport4:
[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

Output from Sun C++ 12.2 with our stdcxx (patched):
[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

Output from Pathscale 4.0.12.1 (which didn't patch stdcxx):
[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]

[ ... ]

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:

_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; // - !!
}

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