Fixes are available
XL C/C++ for AIX Fix Pack 5 (September 2013 PTF) for 12.1
XL C/C++ for AIX Fix Pack 7 (January 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 8 (March 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 11 (February 2015 PTF) for 12.1
XL C/C++ for AIX Fix Pack 12 (May 2015 PTF) for 12.1
XL C/C++ for AIX Fix Pack 13 (August 2015 Update) for 12.1
XL C/C++ for AIX Fix Pack 14 (December 2015 Update) for 12.1
XL C/C++ for AIX Fix Pack 15 (April 2016 Update) for 12.1
XL C/C++ for AIX Fix Pack 16 (July 2016 Update) for 12.1
XL C/C++ for AIX Fix Pack 17 (November 2016 Update) for 12.1
XL C/C++ for AIX Fix Pack 18 (February 2017 Update) for 12.1
XL C/C++ for AIX Fix Pack 19 (August 2017 Update) for 12.1
XL C/C++ for AIX Fix Pack 20 (March 2018 Update) for 12.1
XL C/C++ for AIX Fix Pack 6 (December 2013 PTF) for 12.1
XL C/C++ for AIX Fix Pack 9 (July 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 10 (October 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 21 (January 2019 Update) for 12.1
APAR status
Closed as program error.
Error description
All the following allocations should call Foo::operator new[] with a 'size' argument equal to '420' because they all allocate 10 'Foo<Buffer>' (or 'Foo<Buf>') objects and the size of each of these objects should be '42' (i.e. the size of their 'Buffer' or 'Buf' attribute). Unfortunately XLC calls the new[] opertor with the array arity (i.e. '10' instead of the array size (i.e.'420')) if the default argument of the new[] operator is not explicitely given and the type of the attribute 'bar' is not a POD (e.g. if it has a constructor like 'Buffer'). ===== COMPILE COMMAND: xlc++ arraynew.cpp ===== TESTCASE: $ cat arraynew.cpp #include <stdio.h> #include <stdlib.h> struct Buf { char buf[42]; }; struct Buffer { char buf[42]; Buffer() {} }; template<class T> struct Foo { void* operator new [](size_t size, int foo = 0) { fprintf(stdout, "Foo::new [](size=%ld, foo=%d)\n", size, foo); return malloc(size); } T bar; }; int main(int argc, char **argv) { fprintf(stdout, "sizeof(Foo<Buffer>[10]) = %ld\n", sizeof(Foo<Buffer>[10])); Foo<Buffer> *buf1 = new Foo<Buffer>[10]; Foo<Buffer> *buf2 = new (123) Foo<Buffer>[10]; fprintf(stdout, "sizeof(Foo<Buf>[10]) = %ld\n", sizeof(Foo<Buf>[10])); Foo<Buf> *buf3 = new Foo<Buf>[10]; Foo<Buf> *buf4 = new (123) Foo<Buf>[10]; } $ ===== ACTUAL OUTPUT: $ ./a.out sizeof(Foo<Buffer>[10]) = 420 Foo::new [](size=10, foo=0) <---- The size value is '10' instead of '420' Foo::new [](size=420, foo=123) sizeof(Foo<Buf>[10]) = 420 Foo::new [](size=420, foo=0) Foo::new [](size=420, foo=123) $ ===== EXPECTED OUTPUT: $ ./a.out sizeof(Foo<Buffer>[10]) = 420 Foo::new [](size=420, foo=0) Foo::new [](size=420, foo=123) sizeof(Foo<Buf>[10]) = 420 Foo::new [](size=420, foo=0) Foo::new [](size=420, foo=123) $
Local fix
n/a
Problem summary
USERS AFFECTED: Customers using array new operators may be affected by this issue. PROBLEM DESCRIPTION: Incorrect memory sizing is allocated when using new[] operator causing incorrect values reported by the sizeof() function. This was due to new[] operator being assigned as a regular member rather than a static member, which passed the wrong *this pointer to the parameters of the new[] operator.
Problem conclusion
The compiler has been fixed so that the new[] operator is now a static member.
Temporary fix
Comments
APAR Information
APAR number
IV49595
Reported component name
XL C/C++ FOR AI
Reported component ID
5725C7200
Reported release
C10
Status
CLOSED PER
PE
NoPE
HIPER
NoHIPER
Special Attention
NoSpecatt / Xsystem
Submitted date
2013-09-18
Closed date
2013-09-18
Last modified date
2013-09-20
APAR is sysrouted FROM one or more of the following:
APAR is sysrouted TO one or more of the following:
Fix information
Fixed component name
XL C/C++ FOR AI
Fixed component ID
5725C7200
Applicable component levels
RC10 PSY UP
C
Document Information
Modified date:
21 August 2024