308 lines · 4.5 KB · C
RawDownload
#include <stdlib.h>#include <stdio.h>#include <string.h> #define NB_ITS 1000000//#define NB_ITS 1#define TAB_SIZE 100 int tab[TAB_SIZE];int ret_sum;char tab3[256]; int test1(void){    int i, sum = 0;    for(i=0;i<TAB_SIZE;i++) {        sum += tab[i];    }    return sum;} /* error */int test2(void){    int i, sum = 0;    for(i=0;i<TAB_SIZE + 1;i++) {        sum += tab[i];    }    return sum;} /* actually, profiling test */int test3(void){    int sum;    int i, it;     sum = 0;    for(it=0;it<NB_ITS;it++) {        for(i=0;i<TAB_SIZE;i++) {            sum += tab[i];        }    }    return sum;} /* ok */int test4(void){    int i, sum = 0;    int *tab4;     tab4 = malloc(20 * sizeof(int));    for(i=0;i<20;i++) {        sum += tab4[i];    }    free(tab4);     return sum;} /* error */int test5(void){    int i, sum = 0;    int *tab4;     tab4 = malloc(20 * sizeof(int));    for(i=0;i<21;i++) {        sum += tab4[i];    }    free(tab4);     return sum;} /* error */int test6(void){    int i, sum = 0;    int *tab4;        tab4 = malloc(20 * sizeof(int));    free(tab4);    for(i=0;i<21;i++) {        sum += tab4[i];    }     return sum;} /* error */int test7(void){    int i, sum = 0;    int *p;     for(i=0;i<TAB_SIZE + 1;i++) {        p = &tab[i];        if (i == TAB_SIZE)            printf("i=%d %x\n", i, p);        sum += *p;    }    return sum;} /* ok */int test8(void){    int i, sum = 0;    int tab[10];     for(i=0;i<10;i++) {        sum += tab[i];    }    return sum;} /* error */int test9(void){    int i, sum = 0;    char tab[10];     for(i=0;i<11;i++) {        sum += tab[i];    }    return sum;} /* ok */int test10(void){    char tab[10];    char tab1[10];     memset(tab, 0, 10);    memcpy(tab, tab1, 10);    memmove(tab, tab1, 10);    return 0;} /* error */int test11(void){    char tab[10];     memset(tab, 0, 11);    return 0;} /* error */int test12(void){    void *ptr;    ptr = malloc(10);    free(ptr);    free(ptr);    return 0;} /* error */int test13(void){    char pad1 = 0;    char tab[10];    char pad2 = 0;    memset(tab, 'a', sizeof(tab));    return strlen(tab);} #if defined __i386__ || defined __x86_64__#define allocf(x)#else#define alloca(x) malloc(x)#define allocf(x) free(x)#endif int test14(void){    char *p = alloca(TAB_SIZE);    size_t ret;    memset(p, 'a', TAB_SIZE);    p[TAB_SIZE-1] = 0;    ret = strlen(p);    allocf(p);    return ret;} /* error */int test15(void){    char *p = alloca(TAB_SIZE-1);    size_t ret;    memset(p, 'a', TAB_SIZE);    p[TAB_SIZE-1] = 0;    ret = strlen(p);    allocf(p);    return ret;} /* ok */int test16(){    char *demo = "This is only a test.";    char *p;     p = alloca(16);    strcpy(p,"12345678901234");    allocf(p);     /* Test alloca embedded in a larger expression */    printf("alloca : %s : %s\n", p, strcpy(alloca(strlen(demo)+1),demo) );     return 0;} /* error */int test17(){    char *demo = "This is only a test.";    char *p;     p = alloca(16);    strcpy(p,"12345678901234");    allocf(p);     /* Test alloca embedded in a larger expression */    printf("alloca : %s : %s\n", p, strcpy(alloca(strlen(demo)),demo) );     return 0;} int test18(void){    int i, sum = 0, n = TAB_SIZE;    int tab[n];    for(i=0;i<TAB_SIZE+1;i++) {        sum += tab[i];    }    return sum;} int (*table_test[])(void) = {    test1,    test2,    test3,    test4,    test5,    test6,    test7,    test8,    test9,    test10,    test11,    test12,    test13,    test14,    test15,    test16,    test17,    test18}; int main(int argc, char **argv){    int i;    char *cp;    int index;    int (*ftest)(void);    int index_max = sizeof(table_test)/sizeof(table_test[0]);     /* check bounds checking main arg */    for (i = 0; i < argc; i++) {        cp = argv[i];        while (*cp) {            cp++;        }    }     if (argc < 2) {        printf(    	    "test TCC bound checking system\n"	    "usage: boundtest N\n"            "  1 <= N <= %d\n", index_max);        exit(1);    }     index = 0;    if (argc >= 2)        index = atoi(argv[1]) - 1;     if ((index < 0) || (index >= index_max)) {        printf("N is outside of the valid range (%d)\n", index);        exit(2);    }     /* well, we also use bounds on this ! */    ftest = table_test[index];    ftest();     return 0;} /* * without bound   0.77 s * with bounds    4.73 */