author | mikek |
Sun, 27 Jun 2010 21:43:55 +0100 | |
branch | GCC_SURGE |
changeset 181 | bd8f1e65581b |
parent 0 | a41df078684a |
permissions | -rw-r--r-- |
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" // which accompanies this distribution, and is available // at the URL "http://www.eclipse.org/legal/epl-v10.html". // // Initial Contributors: // Nokia Corporation - initial contribution. // // Contributors: // // Description: // e32test\misc\exc.cpp // Utility generating various kinds of exceptions. Useful to test // debuggers. // // #include <e32std.h> #include <e32std_private.h> void InfiniteRecursion() { InfiniteRecursion(); } #ifdef __ARMCC__ #pragma Ono_inline // prevent compile time errors #endif void Store42(TInt*& p) { *p = 42; } void Foo() { // uninitialised pointer on stack - may not crash TInt* p; Store42(p); } void Foo1(TUint8 *ps) { TInt32* p = (TInt32*)ps; *p = 0x42; } void Foo2(TUint8 *ps) { TInt16* p = (TInt16*)ps; *p = 0x42; } TInt E32Main() { TBuf<32> cmd; User::CommandLine(cmd); TLex lex(cmd); TInt n=0; lex.Val(n); typedef void (*TPfn)(); switch (n) { default: case 0: { // data abort - accessing non-existent memory TInt* p = (TInt*) 0x1000; *p = 0x42; } break; case 1: // data abort - stack overflow InfiniteRecursion(); break; case 2: { // data abort - pointer in deleted heap cell // May not crash on UREL builds struct S { TInt* iPtr; }; S* p = new S; p->iPtr = new TInt; delete p->iPtr; delete p; *(p->iPtr) = 42; } break; case 3: // data abort - uninitialised pointer on stack Foo(); break; case 4: { // data abort - misaligned access to 32 bit word TUint8 buffer[16]; Foo1(buffer+2); } break; case 5: { // data abort - misaligned access to 16 bit word TUint8 buffer[16]; Foo2 (buffer+1); } break; case 6: { // prefetch abort TPfn f = NULL; f(); } break; case 7: { // undefined instruction TUint32 undef = 0xE6000010; TPfn f = (TPfn) &undef; f(); } break; } return 0; }