#include <stddef.h> void *__allocate_array_OptionA(size_t num, size_t size) { // 1st best unsigned long long tmp = (unsigned long long)size * num; if (tmp >= 0x0000000080000000ULL) tmp=~size_t(0); return operator new[](tmp); }
void *__allocate_array_OptionB(size_t num, size_t size) { // 2nd best unsigned long long tmp = (unsigned long long)size * num; if (tmp >= 0x0000000080000000ULL) return(operator new[](~size_t(0))); return operator new[](tmp); } ----------------------------------------------------------------------------- _Z24__allocate_array_OptionAjj: [ gcc 4.1.3 20070326 (prerelease) : 9 instructions ] movl 8(%esp), %eax mull 4(%esp) cmpl $0, %edx ja .L11 cmpl $2147483647, %eax jbe .L9 .L11: orl $-1, %eax .L9: movl %eax, 4(%esp) jmp _Znaj _Z24__allocate_array_OptionBjj: [ gcc 4.1.3 20070326 (prerelease) : 10 instructions ] movl 8(%esp), %eax mull 4(%esp) cmpl $0, %edx ja .L4 cmpl $2147483647, %eax jbe .L2 .L4: movl $-1, 4(%esp) jmp .L7 # <- why not jmp _Znaj directly? .L2: movl %eax, 4(%esp) .L7: jmp _Znaj ----------------------------------------------------------------------------- It seems to be solved the integer overflow in operator new. J.C. Pizarro.
allocate_array_longmult_april2007.tar.gz
Description: GNU Zip compressed data