tstMemAutoPtr.cpp revision 9d577a7b721cf6430727d2bc2577642310642366
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * IPRT - Testcase the RTMemAutoPtr template.
9d577a7b721cf6430727d2bc2577642310642366vboxsync * Copyright (C) 2008-2010 Oracle Corporation
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 * 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 * 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* Header Files *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync*******************************************************************************/
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/*******************************************************************************
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync* Structures and Typedefs *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync*******************************************************************************/
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync/*******************************************************************************
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync* Global Variables *
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync*******************************************************************************/
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsyncstatic unsigned g_cErrors = 0;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsyncstatic unsigned g_cFrees;
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync * Feel free to inspect with gdb / objdump / whatever / g++ -fverbose-asm in
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync * a release build and compare with tstMemAutoPtrDisas1PureC.
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync * For comparing to tstMemAutoPtrDisas1.
23f378b3dc82e3c392548d491ddef62acd82c447vboxsync TSTMEMAUTOPTRSTRUCT *pHandle = (TSTMEMAUTOPTRSTRUCT *)RTMemRealloc(NULL, sizeof(*pHandle));
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsynctemplate <class T>
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync RTPrintf("tstMemAutoPtr(%d): Destructor called with NILL handle!\n");
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync RTPrintf("tstMemAutoPtr(%d): Destructor called with a bad handle %p\n", aMem);
9d577a7b721cf6430727d2bc2577642310642366vboxsyncvoid *tstMemAutoPtrAllocatorNoZero(void *pvOld, size_t cbNew, const char *pszTag)
9d577a7b721cf6430727d2bc2577642310642366vboxsync void *pvNew = RTMemReallocTag(pvOld, cbNew, pszTag);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync do { bool const f = !!(expr); if (!f) { RTPrintf("tstMemAutoPtr(%d): %s!\n", __LINE__, #expr); g_cErrors++; } } while (0)
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Some simple stuff.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Use the electric fence memory API to check alternative template
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * arguments and also check some subscript / reference limit thing.
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, RTMemEfAutoFree<char>, RTMemEfReallocNP> Electric(10);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync //CHECK_EXPR(Electric == '0');
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /* Electric[10] = '2'; - this will crash (of course) */
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.
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt(128);
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt2(128);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync FreeIt2.reset(FreeIt2.get()); /* this one is weird, but it's how things works... */
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> DontFreeIt(256);
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt3(128);
730ec694931a669c87102e047d453d14dd3917e0vboxsync RTMemAutoPtr<char, tstMemAutoPtrDestructorCounter, RTMemEfReallocNP> FreeIt4;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Check the ->, [] and * (unary) operators with some useful struct.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync /* since at it... */
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync * Check the zeroing of memory.
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<uint64_t, RTMemAutoDestructor<uint64_t>, tstMemAutoPtrAllocatorNoZero> Zeroed1(1, true);
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTMemAutoPtr<uint64_t, RTMemAutoDestructor<uint64_t>, tstMemAutoPtrAllocatorNoZero> Zeroed2;
02bf7b8fb97d97efd7b5c1288b6a88309df0e669vboxsync RTPrintf("tstMemAutoPtr: FAILED - %d errors\n", g_cErrors);
e6508e443d84509f6b0bc030e94f1877e1e9122evboxsync#endif /* TST_MEM_AUTO_PTR_ONLY_DISAS */