Merge pull request #1255 from terrelln/norm-fix
[FSE] Fix division by zero
This commit is contained in:
@@ -331,7 +331,7 @@ void FSE_freeCTable (FSE_CTable* ct) { free(ct); }
|
|||||||
/* provides the minimum logSize to safely represent a distribution */
|
/* provides the minimum logSize to safely represent a distribution */
|
||||||
static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue)
|
static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue)
|
||||||
{
|
{
|
||||||
U32 minBitsSrc = BIT_highbit32((U32)(srcSize - 1)) + 1;
|
U32 minBitsSrc = BIT_highbit32((U32)(srcSize)) + 1;
|
||||||
U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2;
|
U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2;
|
||||||
U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols;
|
U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols;
|
||||||
assert(srcSize > 1); /* Not supported, RLE should be used instead */
|
assert(srcSize > 1); /* Not supported, RLE should be used instead */
|
||||||
@@ -394,6 +394,9 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count,
|
|||||||
}
|
}
|
||||||
ToDistribute = (1 << tableLog) - distributed;
|
ToDistribute = (1 << tableLog) - distributed;
|
||||||
|
|
||||||
|
if (ToDistribute == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if ((total / ToDistribute) > lowOne) {
|
if ((total / ToDistribute) > lowOne) {
|
||||||
/* risk of rounding to zero */
|
/* risk of rounding to zero */
|
||||||
lowOne = (U32)((total * 3) / (ToDistribute * 2));
|
lowOne = (U32)((total * 3) / (ToDistribute * 2));
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include <string.h> /* strcmp */
|
#include <string.h> /* strcmp */
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressContinue, ZSTD_compressBlock */
|
#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressContinue, ZSTD_compressBlock */
|
||||||
|
#include "fse.h"
|
||||||
#include "zstd.h" /* ZSTD_VERSION_STRING */
|
#include "zstd.h" /* ZSTD_VERSION_STRING */
|
||||||
#include "zstd_errors.h" /* ZSTD_getErrorCode */
|
#include "zstd_errors.h" /* ZSTD_getErrorCode */
|
||||||
#include "zstdmt_compress.h"
|
#include "zstdmt_compress.h"
|
||||||
@@ -1423,6 +1424,24 @@ static int basicUnitTests(U32 seed, double compressibility)
|
|||||||
}
|
}
|
||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
|
DISPLAYLEVEL(3, "test%3i : testing FSE_normalizeCount() PR#1255: ", testNb++);
|
||||||
|
{
|
||||||
|
short norm[32];
|
||||||
|
unsigned count[32];
|
||||||
|
unsigned const tableLog = 5;
|
||||||
|
size_t const nbSeq = 32;
|
||||||
|
unsigned const maxSymbolValue = 31;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < 32; ++i)
|
||||||
|
count[i] = 1;
|
||||||
|
/* Calling FSE_normalizeCount() on a uniform distribution should not
|
||||||
|
* cause a division by zero.
|
||||||
|
*/
|
||||||
|
FSE_normalizeCount(norm, tableLog, count, nbSeq, maxSymbolValue);
|
||||||
|
}
|
||||||
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
free(CNBuffer);
|
free(CNBuffer);
|
||||||
free(compressedBuffer);
|
free(compressedBuffer);
|
||||||
|
|||||||
Reference in New Issue
Block a user