tstMemAutoPtr.cpp revision 9d577a7b721cf6430727d2bc2577642310642366
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/* $Id$ */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/** @file
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * IPRT - Testcase the RTMemAutoPtr template.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/*
9d577a7b721cf6430727d2bc2577642310642366vboxsync * Copyright (C) 2008-2010 Oracle Corporation
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * available from http://www.virtualbox.org. This file is free software;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * you can redistribute it and/or modify it under the terms of the GNU
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * General Public License (GPL) as published by the Free Software
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * The contents of this file may alternatively be used under the terms
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * of the Common Development and Distribution License Version 1.0
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * VirtualBox OSE distribution, in which case the provisions of the
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * CDDL are applicable instead of those of the GPL.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * You may elect to license modified versions of this file under the
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * terms and conditions of either the GPL or the CDDL or both.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/*******************************************************************************
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync* Header Files *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync*******************************************************************************/
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync#include <iprt/mem.h>
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync#include <iprt/stream.h>
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync#include <iprt/initterm.h>
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync#include <iprt/string.h>
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync#include <iprt/rand.h>
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/*******************************************************************************
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync* Structures and Typedefs *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync*******************************************************************************/
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsynctypedef struct TSTMEMAUTOPTRSTRUCT
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync{
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync uint32_t a;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync uint32_t b;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync uint32_t c;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync} TSTMEMAUTOPTRSTRUCT;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/*******************************************************************************
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync* Global Variables *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync*******************************************************************************/
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync#ifndef TST_MEM_AUTO_PTR_ONLY_DISAS
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsyncstatic unsigned g_cErrors = 0;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsyncstatic unsigned g_cFrees;
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync#endif
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync/*
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync * Feel free to inspect with gdb / objdump / whatever / g++ -fverbose-asm in
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync * a release build and compare with tstMemAutoPtrDisas1PureC.
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync */
23f378b3dc82e3c392548d491ddef62acd82c447vboxsyncextern "C" int tstMemAutoPtrDisas1(void **ppv)
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync{
23214ec638d069bd560e9d80520453b931e5d6b8vboxsync RTMemAutoPtr<TSTMEMAUTOPTRSTRUCT> Handle(1);
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync if (!Handle)
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync {
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync Handle->a = RTRandU32();
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync if (Handle->a < UINT32_MAX / 2)
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync {
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync *ppv = Handle.release();
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync return VINF_SUCCESS;
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync }
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync }
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync return VERR_TRY_AGAIN;
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync}
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync/*
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync * For comparing to tstMemAutoPtrDisas1.
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync */
23f378b3dc82e3c392548d491ddef62acd82c447vboxsyncextern "C" int tstMemAutoPtrDisas1PureC(void **ppv)
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync{
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync TSTMEMAUTOPTRSTRUCT *pHandle = (TSTMEMAUTOPTRSTRUCT *)RTMemRealloc(NULL, sizeof(*pHandle));
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync if (pHandle)
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync {
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync pHandle->a = RTRandU32();
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync if (pHandle->a < UINT32_MAX / 2)
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync {
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync *ppv = pHandle;
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync return VINF_SUCCESS;
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync }
c21e63c0995295383bcb9ce19370eed3faccf04dvboxsync RTMemFree(pHandle);
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync }
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync return VERR_TRY_AGAIN;
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync}
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync#ifndef TST_MEM_AUTO_PTR_ONLY_DISAS
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsynctemplate <class T>
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsyncvoid tstMemAutoPtrDestructorCounter(T *aMem)
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync{
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync if (aMem == NULL)
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync {
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync RTPrintf("tstMemAutoPtr(%d): Destructor called with NILL handle!\n");
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync g_cErrors++;
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync }
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync else if (!VALID_PTR(aMem))
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync {
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync RTPrintf("tstMemAutoPtr(%d): Destructor called with a bad handle %p\n", aMem);
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync g_cErrors++;
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync }
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemEfFreeNP(aMem);
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync g_cFrees++;
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync}
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync
9d577a7b721cf6430727d2bc2577642310642366vboxsyncvoid *tstMemAutoPtrAllocatorNoZero(void *pvOld, size_t cbNew, const char *pszTag)
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync{
9d577a7b721cf6430727d2bc2577642310642366vboxsync void *pvNew = RTMemReallocTag(pvOld, cbNew, pszTag);
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync if (pvNew)
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync memset(pvNew, 0xfe, cbNew);
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync return pvNew;
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync}
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsyncint main()
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync{
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync RTR3Init();
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTPrintf("tstMemAutoPtr: TESTING...\n");
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync#define CHECK_EXPR(expr) \
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync do { bool const f = !!(expr); if (!f) { RTPrintf("tstMemAutoPtr(%d): %s!\n", __LINE__, #expr); g_cErrors++; } } while (0)
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /*
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Some simple stuff.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<char> NilObj;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(!NilObj);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(NilObj.get() == NULL);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(NilObj.release() == NULL);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync NilObj.reset();
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<char> Alloc(10);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Alloc.get() != NULL);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync char *pch = Alloc.release();
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(pch != NULL);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Alloc.get() == NULL);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<char> Manage(pch);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Manage.get() == pch);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(&Manage[0] == pch);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(&Manage[1] == &pch[1]);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(&Manage[9] == &pch[9]);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /*
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Use the electric fence memory API to check alternative template
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * arguments and also check some subscript / reference limit thing.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, RTMemEfAutoFree<char>, RTMemEfReallocNP> Electric(10);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Electric.get() != NULL);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Electric[0] = '0';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Electric[0] == '0');
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(*Electric == '0');
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync //CHECK_EXPR(Electric == '0');
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Electric[9] = '1';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Electric[9] == '1');
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /* Electric[10] = '2'; - this will crash (of course) */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /*
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Check that memory is actually free when it should be and isn't when it shouldn't.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Use the electric heap to get some extra checks.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync g_cFrees = 0;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt(128);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt[127] = '0';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(g_cFrees == 1);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync g_cFrees = 0;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt2(128);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt2[127] = '1';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt2.reset();
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt2.alloc(128);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt2[127] = '2';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt2.reset(FreeIt2.get()); /* this one is weird, but it's how things works... */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(g_cFrees == 2);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync g_cFrees = 0;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> DontFreeIt(256);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync DontFreeIt[255] = '0';
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemEfFreeNP(DontFreeIt.release());
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(g_cFrees == 0);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync g_cFrees = 0;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt3(128);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt3[127] = '0';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(FreeIt3.realloc(128));
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt3[127] = '0';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(FreeIt3.realloc(256));
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt3[255] = '0';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(FreeIt3.realloc(64));
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt3[63] = '0';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(FreeIt3.realloc(32));
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt3[31] = '0';
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(g_cFrees == 1);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync g_cFrees = 0;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt4;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(FreeIt4.alloc(123));
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(FreeIt4.realloc(543));
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt4 = (char *)NULL;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(FreeIt4.get() == NULL);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(g_cFrees == 1);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /*
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Check the ->, [] and * (unary) operators with some useful struct.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<TSTMEMAUTOPTRSTRUCT> Struct1(1);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1->a = 0x11223344;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1->b = 0x55667788;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1->c = 0x99aabbcc;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1->a == 0x11223344);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1->b == 0x55667788);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1->c == 0x99aabbcc);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1[0].a = 0x11223344;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1[0].b = 0x55667788;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1[0].c = 0x99aabbcc;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1[0].a == 0x11223344);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1[0].b == 0x55667788);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1[0].c == 0x99aabbcc);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync (*Struct1).a = 0x11223344;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync (*Struct1).b = 0x55667788;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync (*Struct1).c = 0x99aabbcc;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR((*Struct1).a == 0x11223344);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR((*Struct1).b == 0x55667788);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR((*Struct1).c == 0x99aabbcc);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /* since at it... */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1.get()->a = 0x11223344;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1.get()->b = 0x55667788;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Struct1.get()->c = 0x99aabbcc;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1.get()->a == 0x11223344);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1.get()->b == 0x55667788);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Struct1.get()->c == 0x99aabbcc);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /*
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Check the zeroing of memory.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<uint64_t, RTMemAutoDestructor<uint64_t>, tstMemAutoPtrAllocatorNoZero> Zeroed1(1, true);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(*Zeroed1 == 0);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync {
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<uint64_t, RTMemAutoDestructor<uint64_t>, tstMemAutoPtrAllocatorNoZero> Zeroed2;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync Zeroed2.alloc(5, true);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Zeroed2[0] == 0);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Zeroed2[1] == 0);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Zeroed2[2] == 0);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Zeroed2[3] == 0);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync CHECK_EXPR(Zeroed2[4] == 0);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync }
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /*
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Summary.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync if (!g_cErrors)
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTPrintf("tstMemAutoPtr: SUCCESS\n");
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync else
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTPrintf("tstMemAutoPtr: FAILED - %d errors\n", g_cErrors);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync return !!g_cErrors;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync}
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync#endif /* TST_MEM_AUTO_PTR_ONLY_DISAS */