IBM Support

LI77788: 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

    LI77788

  • Reported component name

    XL C/C++ RHEL52

  • Reported component ID

    5724U8310

  • Reported release

    A10

  • Status

    CLOSED PER

  • PE

    NoPE

  • HIPER

    NoHIPER

  • Special Attention

    NoSpecatt

  • Submitted date

    2014-01-15

  • Closed date

    2014-01-15

  • Last modified date

    2014-01-15

  • 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++ RHEL52

  • Fixed component ID

    5724U8310

Applicable component levels

[{"Business Unit":{"code":"BU054","label":"Systems w\/TPS"},"Product":{"code":"SSJT9L","label":"XL C\/C++"},"Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"A.1","Line of Business":{"code":"LOB08","label":"Cognitive Systems"}}]

Document Information

Modified date:
14 October 2021