tstMemAutoPtr.cpp revision 23214ec638d069bd560e9d80520453b931e5d6b8
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync/* $Id$ */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @file
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * IPRT - Testcase the RTMemAutoPtr template.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync * Copyright (C) 2008 Sun Microsystems, Inc.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * available from http://www.virtualbox.org. This file is free software;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync *
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * The contents of this file may alternatively be used under the terms
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * of the Common Development and Distribution License Version 1.0
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * VirtualBox OSE distribution, in which case the provisions of the
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * CDDL are applicable instead of those of the GPL.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * You may elect to license modified versions of this file under the
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * terms and conditions of either the GPL or the CDDL or both.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
662d52947eeb3fc8fca3b23991a5eee47077f896vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsync * additional information or have any questions.
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync */
16a9adc14900ca18e6909679a579f6833425e030vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*******************************************************************************
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync* Header Files *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync*******************************************************************************/
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/mem.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/stream.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/initterm.h>
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#include <iprt/string.h>
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync#include <iprt/rand.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
efff36b306e370346025647a158689021df2e1d1vboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync/*******************************************************************************
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync* Structures and Typedefs *
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync*******************************************************************************/
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsynctypedef struct TSTMEMAUTOPTRSTRUCT
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync{
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync uint32_t a;
efff36b306e370346025647a158689021df2e1d1vboxsync uint32_t b;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync uint32_t c;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync} TSTMEMAUTOPTRSTRUCT;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
efff36b306e370346025647a158689021df2e1d1vboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync/*******************************************************************************
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync* Global Variables *
efff36b306e370346025647a158689021df2e1d1vboxsync*******************************************************************************/
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#ifndef TST_MEM_AUTO_PTR_ONLY_DISAS
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncstatic unsigned g_cErrors = 0;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncstatic unsigned g_cFrees;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#endif
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync/*
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Feel free to inspect with gdb / objdump / whatever / g++ -fverbose-asm in
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * a release build and compare with tstMemAutoPtrDisas1PureC.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern "C" int tstMemAutoPtrDisas1(void **ppv)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync RTMemAutoPtr<TSTMEMAUTOPTRSTRUCT> Handle(1);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync if (!Handle)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync Handle->a = RTRandU32();
0abd77741a608f6c41c8dfcd4781b8b84adf1044vboxsync if (Handle->a < UINT32_MAX / 2)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
9496f2d398b49813176939d7a339ae513d5175efvboxsync *ppv = Handle.release();
9496f2d398b49813176939d7a339ae513d5175efvboxsync return VINF_SUCCESS;
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync return VERR_TRY_AGAIN;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync}
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/*
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * For comparing to tstMemAutoPtrDisas1.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncextern "C" int tstMemAutoPtrDisas1PureC(void **ppv)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync{
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync TSTMEMAUTOPTRSTRUCT *pHandle = (TSTMEMAUTOPTRSTRUCT *)RTMemRealloc(NULL, sizeof(*pHandle));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (pHandle)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pHandle->a = RTRandU32();
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (pHandle->a < UINT32_MAX / 2)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync *ppv = pHandle;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return VINF_SUCCESS;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTMemFree(pHandle);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return VERR_TRY_AGAIN;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync}
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifndef TST_MEM_AUTO_PTR_ONLY_DISAS
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsynctemplate <class T>
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncvoid tstMemAutoPtrDestructorCounter(T *aMem)
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync{
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync if (aMem == NULL)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTPrintf("tstMemAutoPtr(%d): Destructor called with NILL handle!\n");
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync g_cErrors++;
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync }
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync else if (!VALID_PTR(aMem))
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync {
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync RTPrintf("tstMemAutoPtr(%d): Destructor called with a bad handle %p\n", aMem);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync g_cErrors++;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync RTMemEfFree(aMem);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync g_cFrees++;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync}
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncvoid *tstMemAutoPtrAllocatorNoZero(void *pvOld, size_t cbNew)
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync{
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync void *pvNew = RTMemRealloc(pvOld, cbNew);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync if (pvNew)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync memset(pvNew, 0xfe, cbNew);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync return pvNew;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync}
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncint main()
9496f2d398b49813176939d7a339ae513d5175efvboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync RTR3Init(false);
9496f2d398b49813176939d7a339ae513d5175efvboxsync RTPrintf("tstMemAutoPtr: TESTING...\n");
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync#define CHECK_EXPR(expr) \
21029597fc4b76d0db0c9542daee201447281781vboxsync do { bool const f = !!(expr); if (!f) { RTPrintf("tstMemAutoPtr(%d): %s!\n", __LINE__, #expr); g_cErrors++; } } while (0)
21029597fc4b76d0db0c9542daee201447281781vboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync /*
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * Some simple stuff.
9496f2d398b49813176939d7a339ae513d5175efvboxsync */
9496f2d398b49813176939d7a339ae513d5175efvboxsync {
9496f2d398b49813176939d7a339ae513d5175efvboxsync RTMemAutoPtr<char> NilObj;
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_EXPR(!NilObj);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync CHECK_EXPR(NilObj.get() == NULL);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync CHECK_EXPR(NilObj.release() == NULL);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync NilObj.reset();
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync {
9496f2d398b49813176939d7a339ae513d5175efvboxsync RTMemAutoPtr<char> Alloc(10);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_EXPR(Alloc.get() != NULL);
16a9adc14900ca18e6909679a579f6833425e030vboxsync char *pch = Alloc.release();
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(pch != NULL);
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(Alloc.get() == NULL);
16a9adc14900ca18e6909679a579f6833425e030vboxsync
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync RTMemAutoPtr<char> Manage(pch);
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync CHECK_EXPR(Manage.get() == pch);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_EXPR(&Manage[0] == pch);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_EXPR(&Manage[1] == &pch[1]);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_EXPR(&Manage[9] == &pch[9]);
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync /*
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * Use the electric fence memory API to check alternative template
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * arguments and also check some subscript / reference limit thing.
16a9adc14900ca18e6909679a579f6833425e030vboxsync */
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync RTMemAutoPtr<char, RTMemEfAutoFree<char>, RTMemEfRealloc> Electric(10);
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(Electric.get() != NULL);
16a9adc14900ca18e6909679a579f6833425e030vboxsync Electric[0] = '0';
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(Electric[0] == '0');
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(*Electric == '0');
16a9adc14900ca18e6909679a579f6833425e030vboxsync //CHECK_EXPR(Electric == '0');
16a9adc14900ca18e6909679a579f6833425e030vboxsync Electric[9] = '1';
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(Electric[9] == '1');
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync /* Electric[10] = '2'; - this will crash (of course) */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync }
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync /*
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * Check that memory is actually free when it should be and isn't when it shouldn't.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Use the electric heap to get some extra checks.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync g_cFrees = 0;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfRealloc> FreeIt(128);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt[127] = '0';
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync CHECK_EXPR(g_cFrees == 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync g_cFrees = 0;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfRealloc> FreeIt2(128);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt2[127] = '1';
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt2.reset();
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt2.alloc(128);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt2[127] = '2';
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt2.reset(FreeIt2.get()); /* this one is weird, but it's how things works... */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync CHECK_EXPR(g_cFrees == 2);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync g_cFrees = 0;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfRealloc> DontFreeIt(256);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync DontFreeIt[255] = '0';
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync RTMemEfFree(DontFreeIt.release());
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync CHECK_EXPR(g_cFrees == 0);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync g_cFrees = 0;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfRealloc> FreeIt3(128);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt3[127] = '0';
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync CHECK_EXPR(FreeIt3.realloc(128));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync FreeIt3[127] = '0';
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync CHECK_EXPR(FreeIt3.realloc(256));
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync FreeIt3[255] = '0';
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(FreeIt3.realloc(64));
16a9adc14900ca18e6909679a579f6833425e030vboxsync FreeIt3[63] = '0';
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(FreeIt3.realloc(32));
16a9adc14900ca18e6909679a579f6833425e030vboxsync FreeIt3[31] = '0';
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(g_cFrees == 1);
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync g_cFrees = 0;
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfRealloc> FreeIt4;
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(FreeIt4.alloc(123));
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(FreeIt4.realloc(543));
16a9adc14900ca18e6909679a579f6833425e030vboxsync FreeIt4 = (char *)NULL;
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(FreeIt4.get() == NULL);
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync CHECK_EXPR(g_cFrees == 1);
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync /*
16a9adc14900ca18e6909679a579f6833425e030vboxsync * Check the ->, [] and * (unary) operators with some useful struct.
16a9adc14900ca18e6909679a579f6833425e030vboxsync */
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync RTMemAutoPtr<TSTMEMAUTOPTRSTRUCT> Struct1(1);
16a9adc14900ca18e6909679a579f6833425e030vboxsync Struct1->a = 0x11223344;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1->b = 0x55667788;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1->c = 0x99aabbcc;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1->a == 0x11223344);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1->b == 0x55667788);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1->c == 0x99aabbcc);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1[0].a = 0x11223344;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1[0].b = 0x55667788;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1[0].c = 0x99aabbcc;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1[0].a == 0x11223344);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1[0].b == 0x55667788);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1[0].c == 0x99aabbcc);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync (*Struct1).a = 0x11223344;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync (*Struct1).b = 0x55667788;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync (*Struct1).c = 0x99aabbcc;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR((*Struct1).a == 0x11223344);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR((*Struct1).b == 0x55667788);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR((*Struct1).c == 0x99aabbcc);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* since at it... */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1.get()->a = 0x11223344;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1.get()->b = 0x55667788;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Struct1.get()->c = 0x99aabbcc;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1.get()->a == 0x11223344);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1.get()->b == 0x55667788);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Struct1.get()->c == 0x99aabbcc);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync }
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /*
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * Check the zeroing of memory.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync {
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync RTMemAutoPtr<uint64_t, RTMemAutoDestructor<uint64_t>, tstMemAutoPtrAllocatorNoZero> Zeroed1(1, true);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(*Zeroed1 == 0);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync }
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync {
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync RTMemAutoPtr<uint64_t, RTMemAutoDestructor<uint64_t>, tstMemAutoPtrAllocatorNoZero> Zeroed2;
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync Zeroed2.alloc(5, true);
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync CHECK_EXPR(Zeroed2[0] == 0);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Zeroed2[1] == 0);
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync CHECK_EXPR(Zeroed2[2] == 0);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Zeroed2[3] == 0);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync CHECK_EXPR(Zeroed2[4] == 0);
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync /*
9496f2d398b49813176939d7a339ae513d5175efvboxsync * Summary.
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync */
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync if (!g_cErrors)
22ec733a5e041fcdfe02fce2eafc9faf8b0077ddvboxsync RTPrintf("tstMemAutoPtr: SUCCESS\n");
9496f2d398b49813176939d7a339ae513d5175efvboxsync else
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTPrintf("tstMemAutoPtr: FAILED - %d errors\n", g_cErrors);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return !!g_cErrors;
9496f2d398b49813176939d7a339ae513d5175efvboxsync}
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif /* TST_MEM_AUTO_PTR_ONLY_DISAS */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync