unzcrash.c
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:3k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: unzcrash.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:46:11  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* A test program written to test robustness to decompression of
  10.    corrupted data.  Usage is 
  11.        unzcrash filename
  12.    and the program will read the specified file, compress it (in memory),
  13.    and then repeatedly decompress it, each time with a different bit of
  14.    the compressed data inverted, so as to test all possible one-bit errors.
  15.    This should not cause any invalid memory accesses.  If it does, 
  16.    I want to know about it!
  17.    p.s.  As you can see from the above description, the process is
  18.    incredibly slow.  A file of size eg 5KB will cause it to run for
  19.    many hours.
  20. */
  21. #include <stdio.h>
  22. #include <assert.h>
  23. #include "bzlib.h"
  24. #define M_BLOCK 1000000
  25. typedef unsigned char uchar;
  26. #define M_BLOCK_OUT (M_BLOCK + 1000000)
  27. uchar inbuf[M_BLOCK];
  28. uchar outbuf[M_BLOCK_OUT];
  29. uchar zbuf[M_BLOCK + 600 + (M_BLOCK / 100)];
  30. int nIn, nOut, nZ;
  31. static char *bzerrorstrings[] = {
  32.        "OK"
  33.       ,"SEQUENCE_ERROR"
  34.       ,"PARAM_ERROR"
  35.       ,"MEM_ERROR"
  36.       ,"DATA_ERROR"
  37.       ,"DATA_ERROR_MAGIC"
  38.       ,"IO_ERROR"
  39.       ,"UNEXPECTED_EOF"
  40.       ,"OUTBUFF_FULL"
  41.       ,"???"   /* for future */
  42.       ,"???"   /* for future */
  43.       ,"???"   /* for future */
  44.       ,"???"   /* for future */
  45.       ,"???"   /* for future */
  46.       ,"???"   /* for future */
  47. };
  48. void flip_bit ( int bit )
  49. {
  50.    int byteno = bit / 8;
  51.    int bitno  = bit % 8;
  52.    uchar mask = 1 << bitno;
  53.    //fprintf ( stderr, "(byte %d  bit %d  mask %d)",
  54.    //          byteno, bitno, (int)mask );
  55.    zbuf[byteno] ^= mask;
  56. }
  57. int main ( int argc, char** argv )
  58. {
  59.    FILE* f;
  60.    int   r;
  61.    int   bit;
  62.    int   i;
  63.    if (argc != 2) {
  64.       fprintf ( stderr, "usage: unzcrash filenamen" );
  65.       return 1;
  66.    }
  67.    f = fopen ( argv[1], "r" );
  68.    if (!f) {
  69.       fprintf ( stderr, "unzcrash: can't open %sn", argv[1] );
  70.       return 1;
  71.    }
  72.    nIn = fread ( inbuf, 1, M_BLOCK, f );
  73.    fprintf ( stderr, "%d bytes readn", nIn );
  74.    nZ = M_BLOCK;
  75.    r = BZ2_bzBuffToBuffCompress (
  76.          zbuf, &nZ, inbuf, nIn, 9, 0, 30 );
  77.    assert (r == BZ_OK);
  78.    fprintf ( stderr, "%d after compressionn", nZ );
  79.    for (bit = 0; bit < nZ*8; bit++) {
  80.       fprintf ( stderr, "bit %d  ", bit );
  81.       flip_bit ( bit );
  82.       nOut = M_BLOCK_OUT;
  83.       r = BZ2_bzBuffToBuffDecompress (
  84.             outbuf, &nOut, zbuf, nZ, 0, 0 );
  85.       fprintf ( stderr, " %d  %s ", r, bzerrorstrings[-r] );
  86.       if (r != BZ_OK) {
  87.          fprintf ( stderr, "n" );
  88.       } else {
  89.          if (nOut != nIn) {
  90.            fprintf(stderr, "nIn/nOut mismatch %d %dn", nIn, nOut );
  91.            return 1;
  92.          } else {
  93.            for (i = 0; i < nOut; i++)
  94.              if (inbuf[i] != outbuf[i]) { 
  95.                 fprintf(stderr, "mismatch at %dn", i ); 
  96.                 return 1; 
  97.            }
  98.            if (i == nOut) fprintf(stderr, "really ok!n" );
  99.          }
  100.       }
  101.       flip_bit ( bit );
  102.    }
  103. #if 0
  104.    assert (nOut == nIn);
  105.    for (i = 0; i < nOut; i++) {
  106.      if (inbuf[i] != outbuf[i]) {
  107.         fprintf ( stderr, "difference at %d !n", i );
  108.         return 1;
  109.      }
  110.    }
  111. #endif
  112.    fprintf ( stderr, "all okn" );
  113.    return 0;
  114. }