/* ----------------------------------------------------------------------------- * debug.c * * This file contains a variety of different programming errors to test with * WAD. * ----------------------------------------------------------------------------- */ #include #include #include typedef double Real; typedef Real Float; char buffer[256]; /* A simple segmentation fault on an uninitialized pointer */ int seg_crash() { int *a = 0; *a = 3; return 1; } /* Blow the process heap */ int blowheap_crash() { int i; int *a = (int *) malloc(sizeof(int)); for (i = 0;; i++) { a[i] = i; } } /* Buffer overflow crash on the stack */ int overflow_crash() { int a[512]; int i; for (i = 0; i < 1024; i++) { a[i] = i; } } /* A simple bus error. */ int bus_crash() { double *a = (double *) (buffer+1); *a = 3.4; return 1; } /* An assertion */ int abort_crash(int n) { assert(n > 0); return 1; } /* A math error (maybe) */ int math_crash(int x, int y) { return x/y; } void type_crash(int a, short b, char c, unsigned long d, float f, double g) { int la; short lb; char lc; long ld; float lf; double lg; long ll; la = a; lb = b; lc = c; ld = ld; lf = lf; lg = lg; assert(0); } #ifdef NEED_MAIN static const char *usage="\n\ Usage: debug type\n\ seg - Fail with an uninitialized pointer.\n\ bus - Fail with a bus error.\n\ abort - Fail with an assertion error.\n\ math - Fail with a math error.\n\ heap - Blow the process heap.\n\ overflow - Buffer overflow on the stack.\n\ "; int main(int argc, char **argv) { int n; printf("WAD debug program.\n"); if (argc < 2) { printf("%s\n", usage); exit(0); } if (strcmp(argv[1],"abort") == 0) { abort_crash(-4); } else if (strcmp(argv[1],"seg") ==0) { seg_crash(); } else if (strcmp(argv[1],"bus") == 0) { bus_crash(); } else if (strcmp(argv[1],"math") == 0) { math_crash(3,0); } else if (strcmp(argv[1],"heap") == 0) { blowheap_crash(); } else if (strcmp(argv[1],"overflow") == 0) { overflow_crash(); } else if (strcmp(argv[1],"type") == 0) { type_crash(0,2,'x',420000,3.14159,2.1828); } } #endif