1
0
mirror of https://github.com/facebook/zstd.git synced 2025-08-05 19:15:58 +03:00

more tests

This commit is contained in:
Yann Collet
2015-11-18 11:29:32 +01:00
parent 94b9d8ec8d
commit b2549846ba
2 changed files with 66 additions and 72 deletions

View File

@@ -489,68 +489,62 @@ FORCE_INLINE size_t ZSTD_execSequence(BYTE* op,
//if (match > op) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer wrongly removing this test ?) */ //if (match > op) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer wrongly removing this test ?) */
if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */ if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */
if (match < base) if (match < base)
{ {
/* offset beyond prefix */ /* offset beyond prefix */
if (match < vBase) return ERROR(corruption_detected); if (match < vBase) return ERROR(corruption_detected);
match = dictEnd - (base-match); match = dictEnd - (base-match);
if (match + sequence.matchLength <= dictEnd - 8) if (match + sequence.matchLength <= dictEnd)
{ {
ZSTD_wildcopy(op, match, sequence.matchLength); /* works even if matchLength < 8 */ memcpy(op, match, sequence.matchLength);
return oMatchEnd - ostart; return oMatchEnd - ostart;
} }
if (match + sequence.matchLength <= dictEnd) /* span extDict & currentPrefixSegment */
{ {
memcpy(op, match, sequence.matchLength); size_t length1 = dictEnd - match;
return oMatchEnd - ostart; memcpy(op, match, length1);
} op += length1;
/* span extDict & currentPrefixSegment */ sequence.matchLength -= length1;
{ match = base;
size_t length1 = dictEnd - match; }
size_t length2 = sequence.matchLength - length1; }
memcpy(op, match, length1);
op += length1;
memcpy(op, base, length2); /* will fail in case of overlapping match */
return oMatchEnd - ostart;
}
}
{ {
/* match within prefix */ /* match within prefix */
if (sequence.offset < 8) if (sequence.offset < 8)
{ {
/* close range match, overlap */ /* close range match, overlap */
const int dec64 = dec64table[sequence.offset]; const int dec64 = dec64table[sequence.offset];
op[0] = match[0]; op[0] = match[0];
op[1] = match[1]; op[1] = match[1];
op[2] = match[2]; op[2] = match[2];
op[3] = match[3]; op[3] = match[3];
match += dec32table[sequence.offset]; match += dec32table[sequence.offset];
ZSTD_copy4(op+4, match); ZSTD_copy4(op+4, match);
match -= dec64; match -= dec64;
} }
else else
{ {
ZSTD_copy8(op, match); ZSTD_copy8(op, match);
} }
op += 8; match += 8; op += 8; match += 8;
if (oMatchEnd > oend-12) if (oMatchEnd > oend-12)
{ {
if (op < oend_8) if (op < oend_8)
{ {
ZSTD_wildcopy(op, match, oend_8 - op); ZSTD_wildcopy(op, match, oend_8 - op);
match += oend_8 - op; match += oend_8 - op;
op = oend_8; op = oend_8;
} }
while (op < oMatchEnd) *op++ = *match++; while (op < oMatchEnd) *op++ = *match++;
} }
else else
{ {
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */ ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
} }
return oMatchEnd - ostart; return oMatchEnd - ostart;
} }
} }
@@ -660,8 +654,8 @@ size_t ZSTD_decompressDCtx(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, const v
blockProperties_t blockProperties; blockProperties_t blockProperties;
/* init */ /* init */
ctx->base = ctx->vBase = ctx->dictEnd = dst; ctx->base = ctx->vBase = ctx->dictEnd = dst;
/* Frame Header */ /* Frame Header */
if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong); if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
@@ -735,12 +729,12 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, con
if (srcSize != ctx->expected) return ERROR(srcSize_wrong); if (srcSize != ctx->expected) return ERROR(srcSize_wrong);
if (dst != ctx->previousDstEnd) /* not contiguous */ if (dst != ctx->previousDstEnd) /* not contiguous */
{ {
ctx->dictEnd = ctx->previousDstEnd; ctx->dictEnd = ctx->previousDstEnd;
if ((dst > ctx->base) && (dst < ctx->previousDstEnd)) /* rolling buffer : new segment right into tracked memory */ if ((dst > ctx->base) && (dst < ctx->previousDstEnd)) /* rolling buffer : new segment right into tracked memory */
ctx->base = (char*)dst + maxDstSize; /* temporary affectation, for vBase calculation */ ctx->base = (char*)dst + maxDstSize; /* temporary affectation, for vBase calculation */
ctx->vBase = (char*)dst - ((char*)(ctx->dictEnd) - (char*)(ctx->base)); ctx->vBase = (char*)dst - ((char*)(ctx->dictEnd) - (char*)(ctx->base));
ctx->base = dst; ctx->base = dst;
} }
/* Decompress : frame header */ /* Decompress : frame header */
if (ctx->phase == 0) if (ctx->phase == 0)

View File

@@ -155,17 +155,17 @@ test-zstd: zstd datagen
@echo "**** zstd round-trip tests **** " @echo "**** zstd round-trip tests **** "
./datagen | md5sum > tmp1 ./datagen | md5sum > tmp1
./datagen | ./zstd -v | ./zstd -d | md5sum > tmp2 ./datagen | ./zstd -v | ./zstd -d | md5sum > tmp2
diff tmp1 tmp2 # check potential differences diff tmp1 tmp2
./datagen | ./zstd -6 -v | ./zstd -d | md5sum > tmp2 ./datagen | ./zstd -6 -v | ./zstd -d | md5sum > tmp2
diff tmp1 tmp2 # check potential differences diff tmp1 tmp2
./datagen -g256MB | md5sum > tmp1 ./datagen -g256MB | md5sum > tmp1
./datagen -g256MB | ./zstd -v | ./zstd -d | md5sum > tmp2 ./datagen -g256MB | ./zstd -v | ./zstd -d | md5sum > tmp2
#diff tmp1 tmp2 # check potential differences diff tmp1 tmp2
./datagen -g256MB | ./zstd -3 -v | ./zstd -d | md5sum > tmp2 ./datagen -g256MB | ./zstd -3 -v | ./zstd -d | md5sum > tmp2
#diff tmp1 tmp2 # check potential differences diff tmp1 tmp2
./datagen -g6GB -P99 | md5sum > tmp1 ./datagen -g6GB -P99 | md5sum > tmp1
./datagen -g6GB -P99 | ./zstd -vq | ./zstd -d | md5sum > tmp2 ./datagen -g6GB -P99 | ./zstd -vq | ./zstd -d | md5sum > tmp2
#diff tmp1 tmp2 # check potential differences diff tmp1 tmp2
test-zstd32: zstd32 datagen test-zstd32: zstd32 datagen
./datagen | ./zstd32 -v | ./zstd32 -d > $(VOID) ./datagen | ./zstd32 -v | ./zstd32 -d > $(VOID)