home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / seedump.zip / SAMPLES / XALL.C < prev    next >
Text File  |  1995-06-28  |  4KB  |  169 lines

  1. /*
  2. *. ABSTRACT - Part of Seedump
  3. *. AUTHOR   - Wolf Neumann
  4. *. (C) Copyright Wolf Neumann 1995
  5. */
  6.  
  7. /*
  8. *. xall - generates different exceptions
  9. *. ABSTRACT
  10. *.
  11. *. AUTHOR
  12. *. Wolf Neumann, 29 Apr 95
  13. */
  14.  
  15. #define INCL_DOS
  16. #include <os2.h>
  17. #include <stdio.h>
  18. #include <process.h>
  19. #include <stdlib.h>
  20. #include <math.h>
  21. #include "dumper.h"
  22.  
  23. /* typedefs */
  24. typedef int calladdr( int argc, char ** argv);
  25.  
  26. /* function prototypes */
  27. void usage( int argc, char ** argv );
  28. void CallInvalidFunctionAddress( int argc, char ** argv );
  29. int DivideByZero( int argc, char ** argv );
  30. int InvalidPointerAssignment( int argc, char ** argv );
  31. int trapper( int argc, char ** argv );
  32.  
  33. void FloatingPointException( ) /* not working for watcom or cset2 !!! */
  34. {
  35.   double a,b,c = 0.0;
  36.   a = 1.0;
  37.   a = b / c;
  38.   b = a * a;
  39.   b = sqrt( a );
  40.   b = log( a );
  41. }
  42.  
  43. void tthread( )
  44. {
  45.   char * p = (char *)1234;
  46.   SetXCPTHandler( );
  47.   InvalidPointerAssignment( 0, 0 );
  48. }
  49.  
  50. int Recursion( )
  51. {
  52.   int lineno = __LINE__;
  53.   char * fname = __FILE__;
  54.   char consume[1000];
  55.   return Recursion( );
  56. }
  57.  
  58. int main(int argc, char *argv[])
  59. {
  60.   SetXCPTHandler();
  61.   return trapper( argc, argv );
  62. }
  63. int trapper( int argc, char ** argv )
  64. {
  65.   int i;
  66.   char c;
  67.   if (argc == 1)
  68.   {
  69.     usage( argc, argv );
  70.   }
  71.  
  72.   c = argv[1][0];
  73.   if (c >= '0' && c <= '9')
  74.   {
  75.   }
  76.   else
  77.   {
  78.     fprintf( stderr, "%s integer as trap_kind, parm %s invalid\n",
  79.              argv[0], argv[1] );
  80.     usage( argc, argv );
  81.   }
  82.   i = atoi( argv[1] );
  83.   switch (i)
  84.   {
  85.     case 1:
  86.       DivideByZero( argc, argv );
  87.       break;
  88.     case 2:
  89.       InvalidPointerAssignment( argc, argv );
  90.       break;
  91.     case 3:
  92.       printf( "not supported !!\n" );
  93.       break;
  94.     case 4:
  95.       FloatingPointException( );
  96.       break;
  97.     case 5: /* invalid pointer assignm. in thread */
  98.       {
  99.         TID tid;
  100.         DosCreateThread( &tid,
  101.                          (PFNTHREAD)tthread,
  102.                          0,
  103.                          0,
  104.                          4 * 4096 );
  105.         DosWaitThread( &tid, 0 );
  106.       }
  107.       break;
  108.     case 6:
  109.       Recursion( );
  110.       break;
  111.     case 98:
  112.       if (atoi(argv[2]) == 1)
  113.       {
  114.         trapper( 2, argv+3 );
  115.       }
  116.       else
  117.       {
  118.         int k = atoi( argv[2] ) - 1;
  119.         itoa( k, argv[2], 10 );
  120.         trapper( 98, argv );
  121.       }
  122.       break;
  123.     case 99:
  124.       CallInvalidFunctionAddress( argc, argv );
  125.       break;
  126.     default:
  127.       fprintf( stderr, "unknown trap_kind %s\n", argv[1] );
  128.       usage( argc, argv );
  129.   } /* end switch: (i) */
  130.   exit( 0 );
  131.   return 0;
  132. } /* end of : main */
  133.  
  134. void usage( int argc, char ** argv )
  135. {
  136.   int l = strlen( argv[0] );
  137.   fprintf( stderr, "%s integer\n", argv[0] );
  138.   fprintf( stderr, "%*s  1 - divide by zero\n", l, " ", argv[0] );
  139.   fprintf( stderr, "%*s  2 - assign to invalid pointer\n", l, " ", argv[0] );
  140.   fprintf( stderr, "%*s  3 - calls 16-bit code divide by zero\n", l, " ", argv[0] );
  141.   fprintf( stderr, "%*s  4 - floating point exception\n", l, " ", argv[0] );
  142.   fprintf( stderr, "%*s  5 - access violation in thread 2\n", l, " ", argv[0] );
  143.   fprintf( stderr, "%*s 99 - call an ivalid functionaddress\n", l, " ", argv[0] );
  144.   exit( 1 );
  145. }
  146.  
  147. void CallInvalidFunctionAddress( int argc, char ** argv )
  148. {
  149.   ULONG l = (0x17 + (ULONG)main);
  150.   calladdr * m = (calladdr *)l;
  151.   m( argc, argv );
  152. }
  153.  
  154. int DivideByZero( int argc, char ** argv )
  155. {
  156.   int i = 9;
  157.   i /= (i - i);
  158.   return i;
  159. }
  160.  
  161. int InvalidPointerAssignment( int argc, char ** argv )
  162. {
  163.   char * p = (char *)1;
  164.  
  165.   *p = 'a';
  166.   return 0;
  167. }
  168.  
  169.