IV47011: ALLOCATION PROBLEM FOR NEW[] OPERATOR

Subscribe

You can track all active APARs for this component.

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

    IV47011

  • Reported component name

    XL C/C++ AIX

  • Reported component ID

    5724X1300

  • Reported release

    B10

  • Status

    CLOSED PER

  • PE

    NoPE

  • HIPER

    NoHIPER

  • Special Attention

    NoSpecatt

  • Submitted date

    2013-08-13

  • Closed date

    2013-08-13

  • Last modified date

    2013-08-13

  • APAR is sysrouted FROM one or more of the following:

    IV44606

  • APAR is sysrouted TO one or more of the following:

Fix information

  • Fixed component name

    XL C/C++ AIX

  • Fixed component ID

    5724X1300

Applicable component levels

  • RB10 PSY U860996

       UP C



Rate this page:

(0 users)Average rating

Add comments

Document information


More support for:

XL C/C++ for AIX

Software version:

11.1

Reference #:

IV47011

Modified date:

2013-08-13

Translate my page

Machine Translation

Content navigation