--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/misc/exc.cpp Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,125 @@
+// 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;
+ }