From: Nathan Moinvaziri Date: Sun, 5 Jun 2022 23:54:32 +0000 (-0700) Subject: Fix MSVC possible loss of data warning in crc32_pclmulqdq by converting len types... X-Git-Tag: 2.1.0-beta1~214 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e243e4436ce968a6d5261e6ff9203aa80614177;p=thirdparty%2Fzlib-ng.git Fix MSVC possible loss of data warning in crc32_pclmulqdq by converting len types to use uint64_t. arch\x86\crc32_fold_pclmulqdq.c(604,43): warning C4244: 'function': conversion from 'uint64_t' to 'size_t', possible loss of data --- diff --git a/arch/s390/crc32-vx.c b/arch/s390/crc32-vx.c index d0df83cce..088800344 100644 --- a/arch/s390/crc32-vx.c +++ b/arch/s390/crc32-vx.c @@ -21,7 +21,7 @@ typedef unsigned char uv16qi __attribute__((vector_size(16))); typedef unsigned int uv4si __attribute__((vector_size(16))); typedef unsigned long long uv2di __attribute__((vector_size(16))); -static uint32_t crc32_le_vgfm_16(uint32_t crc, const unsigned char *buf, size_t len) { +static uint32_t crc32_le_vgfm_16(uint32_t crc, const unsigned char *buf, uint64_t len) { /* * The CRC-32 constant block contains reduction constants to fold and * process particular chunks of the input data stream in parallel. diff --git a/arch/x86/crc32_fold_pclmulqdq.c b/arch/x86/crc32_fold_pclmulqdq.c index 3e0372bf9..3d0eaf353 100644 --- a/arch/x86/crc32_fold_pclmulqdq.c +++ b/arch/x86/crc32_fold_pclmulqdq.c @@ -32,11 +32,11 @@ #include #ifdef X86_VPCLMULQDQ_CRC -extern size_t fold_16_vpclmulqdq(__m128i *xmm_crc0, __m128i *xmm_crc1, - __m128i *xmm_crc2, __m128i *xmm_crc3, const uint8_t *src, size_t len, __m128i init_crc, +extern uint64_t fold_16_vpclmulqdq(__m128i *xmm_crc0, __m128i *xmm_crc1, + __m128i *xmm_crc2, __m128i *xmm_crc3, const uint8_t *src, uint64_t len, __m128i init_crc, int32_t first); -extern size_t fold_16_vpclmulqdq_copy(__m128i *xmm_crc0, __m128i *xmm_crc1, - __m128i *xmm_crc2, __m128i *xmm_crc3, uint8_t *dst, const uint8_t *src, size_t len); +extern uint64_t fold_16_vpclmulqdq_copy(__m128i *xmm_crc0, __m128i *xmm_crc1, + __m128i *xmm_crc2, __m128i *xmm_crc3, uint8_t *dst, const uint8_t *src, uint64_t len); #endif static void fold_1(__m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2, __m128i *xmm_crc3) { @@ -185,7 +185,7 @@ static const unsigned ALIGNED_(32) pshufb_shf_table[60] = { 0x0201008f, 0x06050403, 0x0a090807, 0x0e0d0c0b /* shl 1 (16 -15)/shr15*/ }; -static void partial_fold(const size_t len, __m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2, +static void partial_fold(const uint64_t len, __m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2, __m128i *xmm_crc3, __m128i *xmm_crc_part) { const __m128i xmm_fold4 = _mm_set_epi32( 0x00000001, 0x54442bd4, diff --git a/arch/x86/crc32_fold_pclmulqdq_tpl.h b/arch/x86/crc32_fold_pclmulqdq_tpl.h index 4227c72cd..36207953b 100644 --- a/arch/x86/crc32_fold_pclmulqdq_tpl.h +++ b/arch/x86/crc32_fold_pclmulqdq_tpl.h @@ -20,9 +20,9 @@ #ifdef X86_PCLMULQDQ_CRC #ifdef COPY -Z_INTERNAL void crc32_fold_pclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) { +Z_INTERNAL void crc32_fold_pclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, uint64_t len) { #else -Z_INTERNAL void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) { +Z_INTERNAL void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, uint64_t len, uint32_t init_crc) { #endif unsigned long algn_diff; __m128i xmm_t0, xmm_t1, xmm_t2, xmm_t3; @@ -47,9 +47,9 @@ Z_INTERNAL void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t if (len == 0) return; - memcpy(partial_buf, src, len); + memcpy(partial_buf, src, (size_t)len); xmm_crc_part = _mm_load_si128((const __m128i *)partial_buf); - memcpy(dst, partial_buf, len); + memcpy(dst, partial_buf, (size_t)len); #endif goto partial; } @@ -82,10 +82,10 @@ Z_INTERNAL void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t #ifdef X86_VPCLMULQDQ_CRC if (x86_cpu_has_vpclmulqdq && x86_cpu_has_avx512 && (len >= 256)) { #ifdef COPY - size_t n = fold_16_vpclmulqdq_copy(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, dst, src, len); + uint64_t n = fold_16_vpclmulqdq_copy(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, dst, src, len); dst += n; #else - size_t n = fold_16_vpclmulqdq(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, src, len, + uint64_t n = fold_16_vpclmulqdq(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, src, len, xmm_initial, first); first = 0; #endif @@ -176,10 +176,10 @@ Z_INTERNAL void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t partial: if (len) { - memcpy(&xmm_crc_part, src, len); + memcpy(&xmm_crc_part, src, (size_t)len); #ifdef COPY _mm_storeu_si128((__m128i *)partial_buf, xmm_crc_part); - memcpy(dst, partial_buf, len); + memcpy(dst, partial_buf, (size_t)len); #endif partial_fold((size_t)len, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, &xmm_crc_part); } diff --git a/arch/x86/crc32_fold_vpclmulqdq_tpl.h b/arch/x86/crc32_fold_vpclmulqdq_tpl.h index 89378aef9..e75278f98 100644 --- a/arch/x86/crc32_fold_vpclmulqdq_tpl.h +++ b/arch/x86/crc32_fold_vpclmulqdq_tpl.h @@ -4,18 +4,18 @@ */ #ifdef COPY -size_t fold_16_vpclmulqdq_copy(__m128i *xmm_crc0, __m128i *xmm_crc1, - __m128i *xmm_crc2, __m128i *xmm_crc3, uint8_t *dst, const uint8_t *src, size_t len) { +uint64_t fold_16_vpclmulqdq_copy(__m128i *xmm_crc0, __m128i *xmm_crc1, + __m128i *xmm_crc2, __m128i *xmm_crc3, uint8_t *dst, const uint8_t *src, uint64_t len) { #else -size_t fold_16_vpclmulqdq(__m128i *xmm_crc0, __m128i *xmm_crc1, - __m128i *xmm_crc2, __m128i *xmm_crc3, const uint8_t *src, size_t len, +uint64_t fold_16_vpclmulqdq(__m128i *xmm_crc0, __m128i *xmm_crc1, + __m128i *xmm_crc2, __m128i *xmm_crc3, const uint8_t *src, uint64_t len, __m128i init_crc, int32_t first) { __m512i zmm_initial = _mm512_zextsi128_si512(init_crc); #endif __m512i zmm_t0, zmm_t1, zmm_t2, zmm_t3; __m512i zmm_crc0, zmm_crc1, zmm_crc2, zmm_crc3; __m512i z0, z1, z2, z3; - size_t len_tmp = len; + uint64_t len_tmp = len; const __m512i zmm_fold4 = _mm512_set4_epi32( 0x00000001, 0x54442bd4, 0x00000001, 0xc6e41596); const __m512i zmm_fold16 = _mm512_set4_epi32( diff --git a/cpu_features.h b/cpu_features.h index aec267bf4..50fdf6156 100644 --- a/cpu_features.h +++ b/cpu_features.h @@ -65,8 +65,8 @@ extern uint32_t adler32_fold_copy_avx512_vnni(uint32_t adler, uint8_t *dst, cons /* CRC32 folding */ #ifdef X86_PCLMULQDQ_CRC extern uint32_t crc32_fold_pclmulqdq_reset(crc32_fold *crc); -extern void crc32_fold_pclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len); -extern void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc); +extern void crc32_fold_pclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, uint64_t len); +extern void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, uint64_t len, uint32_t init_crc); extern uint32_t crc32_fold_pclmulqdq_final(crc32_fold *crc); extern uint32_t crc32_pclmulqdq(uint32_t crc32, const unsigned char* buf, uint64_t len); #endif diff --git a/crc32_fold.c b/crc32_fold.c index b3072e374..eb0aeeb76 100644 --- a/crc32_fold.c +++ b/crc32_fold.c @@ -12,12 +12,20 @@ Z_INTERNAL uint32_t crc32_fold_reset_c(crc32_fold *crc) { return crc->value; } -Z_INTERNAL void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) { +Z_INTERNAL void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, uint64_t len) { crc->value = functable.crc32(crc->value, src, len); - memcpy(dst, src, len); + while (len > SIZE_MAX) { + memcpy(dst, src, SIZE_MAX); + dst += SIZE_MAX; + src += SIZE_MAX; + len -= SIZE_MAX; + } + if (len) { + memcpy(dst, src, (size_t)len); + } } -Z_INTERNAL void crc32_fold_c(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) { +Z_INTERNAL void crc32_fold_c(crc32_fold *crc, const uint8_t *src, uint64_t len, uint32_t init_crc) { /* Note: while this is basically the same thing as the vanilla CRC function, we still need * a functable entry for it so that we can generically dispatch to this function with the * same arguments for the versions that _do_ do a folding CRC but we don't want a copy. The diff --git a/crc32_fold.h b/crc32_fold.h index 0d2ff6696..6aef54670 100644 --- a/crc32_fold.h +++ b/crc32_fold.h @@ -14,8 +14,8 @@ typedef struct crc32_fold_s { } crc32_fold; Z_INTERNAL uint32_t crc32_fold_reset_c(crc32_fold *crc); -Z_INTERNAL void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len); -Z_INTERNAL void crc32_fold_c(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc); +Z_INTERNAL void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, uint64_t len); +Z_INTERNAL void crc32_fold_c(crc32_fold *crc, const uint8_t *src, uint64_t len, uint32_t init_crc); Z_INTERNAL uint32_t crc32_fold_final_c(crc32_fold *crc); #endif diff --git a/functable.c b/functable.c index ca95df55d..0e0418c25 100644 --- a/functable.c +++ b/functable.c @@ -233,7 +233,7 @@ Z_INTERNAL uint32_t crc32_fold_reset_stub(crc32_fold *crc) { return functable.crc32_fold_reset(crc); } -Z_INTERNAL void crc32_fold_copy_stub(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) { +Z_INTERNAL void crc32_fold_copy_stub(crc32_fold *crc, uint8_t *dst, const uint8_t *src, uint64_t len) { functable.crc32_fold_copy = &crc32_fold_copy_c; cpu_check_features(); #ifdef X86_PCLMULQDQ_CRC @@ -243,7 +243,7 @@ Z_INTERNAL void crc32_fold_copy_stub(crc32_fold *crc, uint8_t *dst, const uint8_ functable.crc32_fold_copy(crc, dst, src, len); } -Z_INTERNAL void crc32_fold_stub(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) { +Z_INTERNAL void crc32_fold_stub(crc32_fold *crc, const uint8_t *src, uint64_t len, uint32_t init_crc) { functable.crc32_fold = &crc32_fold_c; cpu_check_features(); #ifdef X86_PCLMULQDQ_CRC diff --git a/functable.h b/functable.h index da7726e45..6d6d7e460 100644 --- a/functable.h +++ b/functable.h @@ -15,8 +15,8 @@ struct functable_s { uint32_t (* adler32_fold_copy) (uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len); uint32_t (* crc32) (uint32_t crc, const unsigned char *buf, uint64_t len); uint32_t (* crc32_fold_reset) (crc32_fold *crc); - void (* crc32_fold_copy) (crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len); - void (* crc32_fold) (crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc); + void (* crc32_fold_copy) (crc32_fold *crc, uint8_t *dst, const uint8_t *src, uint64_t len); + void (* crc32_fold) (crc32_fold *crc, const uint8_t *src, uint64_t len, uint32_t init_crc); uint32_t (* crc32_fold_final) (crc32_fold *crc); uint32_t (* compare256) (const uint8_t *src0, const uint8_t *src1); uint32_t (* chunksize) (void);