summaryrefslogtreecommitdiffstats
path: root/programs/fuzzer.c
diff options
context:
space:
mode:
Diffstat (limited to 'programs/fuzzer.c')
-rw-r--r--programs/fuzzer.c63
1 files changed, 51 insertions, 12 deletions
diff --git a/programs/fuzzer.c b/programs/fuzzer.c
index 1ea14f6..081f0df 100644
--- a/programs/fuzzer.c
+++ b/programs/fuzzer.c
@@ -187,7 +187,7 @@ int FUZ_SecurityTest()
#define FUZ_MAX(a,b) (a>b?a:b)
-int FUZ_test(U32 seed, int nbTests, double compressibility) {
+int FUZ_test(U32 seed, int nbCycles, int startCycle, double compressibility) {
unsigned long long bytes = 0;
unsigned long long cbytes = 0;
unsigned long long hcbytes = 0;
@@ -197,10 +197,10 @@ int FUZ_test(U32 seed, int nbTests, double compressibility) {
char* decodedBuffer;
# define FUZ_max LZ4_COMPRESSBOUND(LEN)
unsigned int randState=seed;
- int ret, attemptNb;
+ int ret, cycleNb;
# define FUZ_CHECKTEST(cond, ...) if (cond) { printf("Test %i : ", testNb); printf(__VA_ARGS__); \
- printf(" (seed %u, cycle %i) \n", seed, attemptNb); goto _output_error; }
-# define FUZ_DISPLAYTEST testNb++; no_prompt ? 0 : printf("%2i\b\b", testNb);
+ printf(" (seed %u, cycle %i) \n", seed, cycleNb); goto _output_error; }
+# define FUZ_DISPLAYTEST { testNb++; no_prompt ? 0 : printf("%2i\b\b", testNb); }
void* stateLZ4 = malloc(LZ4_sizeofState());
void* stateLZ4HC = malloc(LZ4_sizeofStateHC());
void* LZ4continue;
@@ -213,8 +213,16 @@ int FUZ_test(U32 seed, int nbTests, double compressibility) {
compressedBuffer = malloc(LZ4_compressBound(FUZ_MAX_BLOCK_SIZE));
decodedBuffer = malloc(FUZ_MAX_DICT_SIZE + FUZ_MAX_BLOCK_SIZE);
+ // move to startCycle
+ for (cycleNb = 0; cycleNb < startCycle; cycleNb++)
+ {
+ FUZ_rand(&randState);
+ FUZ_rand(&randState);
+ FUZ_rand(&randState);
+ }
+
// Test loop
- for (attemptNb = 0; attemptNb < nbTests; attemptNb++)
+ for (cycleNb = startCycle; cycleNb < nbCycles; cycleNb++)
{
int testNb = 0;
char* dict;
@@ -224,11 +232,11 @@ int FUZ_test(U32 seed, int nbTests, double compressibility) {
// note : promptThrottle is throtting stdout to prevent
// Travis-CI's output limit (10MB) and false hangup detection.
- const int step = FUZ_MAX(1, nbTests / 100);
- const int promptThrottle = ((attemptNb % step) == 0);
- if (!no_prompt || attemptNb == 0 || promptThrottle)
+ const int step = FUZ_MAX(1, nbCycles / 100);
+ const int promptThrottle = ((cycleNb % step) == 0);
+ if (!no_prompt || cycleNb == 0 || promptThrottle)
{
- printf("\r%7i /%7i - ", attemptNb, nbTests);
+ printf("\r%7i /%7i - ", cycleNb, nbCycles);
if (no_prompt) fflush(stdout);
}
@@ -305,7 +313,7 @@ int FUZ_test(U32 seed, int nbTests, double compressibility) {
ret = LZ4_decompress_safe(compressedBuffer, decodedBuffer, compressedSize, blockSize+1);
FUZ_CHECKTEST(ret<0, "LZ4_decompress_safe failed despite amply sufficient space");
FUZ_CHECKTEST(ret!=blockSize, "LZ4_decompress_safe did not regenerate original data");
- //FUZ_CHECKTEST(decodedBuffer[blockSize], "LZ4_decompress_safe wrote more than target size"); // well, is that an issue ?
+ //FUZ_CHECKTEST(decodedBuffer[blockSize], "LZ4_decompress_safe wrote more than (unknown) target size"); // well, is that an issue ?
FUZ_CHECKTEST(decodedBuffer[blockSize+1], "LZ4_decompress_safe overrun specified output buffer size");
crcCheck = XXH32(decodedBuffer, blockSize, 0);
FUZ_CHECKTEST(crcCheck!=crcOrig, "LZ4_decompress_safe corrupted decoded data");
@@ -409,6 +417,18 @@ int FUZ_test(U32 seed, int nbTests, double compressibility) {
crcCheck = XXH32(decodedBuffer+dictSize, blockSize, 0);
FUZ_CHECKTEST(crcCheck!=crcOrig, "LZ4_decompress_safe_withPrefix64k corrupted decoded data");
+ // Compress using dictionary
+ FUZ_DISPLAYTEST;
+ dict -= 9;
+ if (dict < (char*)CNBuffer) dict = (char*)CNBuffer;
+ {
+ LZ4_dict_t LZ4dict;
+ memset(&LZ4dict, 0, sizeof(LZ4_dict_t));
+ LZ4_loadDict(&LZ4dict, dict, dictSize);
+ blockContinueCompressedSize = LZ4_compress_usingDict(&LZ4dict, block, compressedBuffer, blockSize);
+ FUZ_CHECKTEST(blockContinueCompressedSize==0, "LZ4_compress_usingDict failed");
+ }
+
// Decompress with dictionary as external
FUZ_DISPLAYTEST;
decodedBuffer[blockSize] = 0;
@@ -416,6 +436,13 @@ int FUZ_test(U32 seed, int nbTests, double compressibility) {
FUZ_CHECKTEST(ret!=blockContinueCompressedSize, "LZ4_decompress_fast_usingDict did not read all compressed block input");
FUZ_CHECKTEST(decodedBuffer[blockSize], "LZ4_decompress_fast_usingDict overrun specified output buffer size")
crcCheck = XXH32(decodedBuffer, blockSize, 0);
+ if (crcCheck!=crcOrig)
+ {
+ int i=0;
+ while (block[i]==decodedBuffer[i]) i++;
+ printf("Wrong Byte at position %i/%i\n", i, blockSize);
+
+ }
FUZ_CHECKTEST(crcCheck!=crcOrig, "LZ4_decompress_fast_usingDict corrupted decoded data");
FUZ_DISPLAYTEST;
@@ -455,7 +482,7 @@ int FUZ_test(U32 seed, int nbTests, double compressibility) {
ccbytes += blockContinueCompressedSize;
}
- printf("\r%7i /%7i - ", attemptNb, nbTests);
+ printf("\r%7i /%7i - ", cycleNb, nbCycles);
printf("all tests completed successfully \n");
printf("compression ratio: %0.3f%%\n", (double)cbytes/bytes*100);
printf("HC compression ratio: %0.3f%%\n", (double)hcbytes/bytes*100);
@@ -489,6 +516,7 @@ int FUZ_usage()
DISPLAY( "Arguments :\n");
DISPLAY( " -i# : Nb of tests (default:%i) \n", NB_ATTEMPTS);
DISPLAY( " -s# : Select seed (default:prompt user)\n");
+ DISPLAY( " -t# : Select starting test number (default:0)\n");
DISPLAY( " -p# : Select compressibility in %% (default:%i%%)\n", FUZ_COMPRESSIBILITY_DEFAULT);
DISPLAY( " -h : display help and exit\n");
return 0;
@@ -502,6 +530,7 @@ int main(int argc, char** argv) {
int seedset=0;
int argNb;
int nbTests = NB_ATTEMPTS;
+ int testNb = 0;
int proba = FUZ_COMPRESSIBILITY_DEFAULT;
// Check command line
@@ -544,6 +573,16 @@ int main(int argc, char** argv) {
argument++;
}
break;
+ case 't':
+ argument++;
+ testNb=0;
+ while ((*argument>='0') && (*argument<='9'))
+ {
+ testNb *= 10;
+ testNb += *argument - '0';
+ argument++;
+ }
+ break;
case 'p':
argument++;
proba=0;
@@ -583,5 +622,5 @@ int main(int argc, char** argv) {
if (nbTests<=0) nbTests=1;
- return FUZ_test(seed, nbTests, ((double)proba) / 100);
+ return FUZ_test(seed, nbTests, testNb, ((double)proba) / 100);
}