diff options
Diffstat (limited to 'exp-sgcheck/tests/syscall.c')
-rw-r--r-- | exp-sgcheck/tests/syscall.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/exp-sgcheck/tests/syscall.c b/exp-sgcheck/tests/syscall.c new file mode 100644 index 00000000..b446275b --- /dev/null +++ b/exp-sgcheck/tests/syscall.c @@ -0,0 +1,59 @@ +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/time.h> + +// For some reason, the stack frame below __GI_write is disappearing. +// Therefore, if I don't want the write errors to be merged, I have to +// ensure they have a different stack trace. I do this by using this +// function. Weird. +__attribute__((noinline)) +void mywrite(char* buf, int len) +{ + write(-1, buf, len); +} + +__attribute__((noinline)) +void mygetitimer(long arg1, struct itimerval* itval) +{ + getitimer(arg1, itval); +} + +__attribute__((noinline)) +void myopen(char* name, long flags) +{ + open(name, flags); +} + +int main(void) +{ + char *buf = malloc(sizeof(char)*6), *buf2 = malloc(sizeof(char)*6); + struct itimerval* itval = malloc(sizeof(struct itimerval) - 1); + int diff = buf2 - buf; + buf[0] = 'h'; + buf[1] = 'e'; + buf[2] = 'l'; + buf[3] = 'l'; + buf[4] = 'o'; + buf[5] = 'x'; + + // error (read) (will fail due to -1, as we want -- don't want any + // unpredictable output to foul up the test) + mywrite(buf+3, 5); // error (read) + mywrite(buf-1, 5); // error (read) + mywrite(buf+1, diff); // error (read) + myopen(buf+3, 0x0); // error (read_asciiz) + + mygetitimer(0, itval); // error (write) + + //---- + free(buf); + mywrite(buf, 5); // error + mywrite(buf+3, 5); // error + mywrite(buf+1, diff); // error (read) + + return 0; +} |