Подробности
[В начало]
Проблема в реализации № S0846
Краткое описание
тип возвращаемого значения get_crc_table не соответствует LSB (x86_64)
Подробное описание
Согласно LSB get_crc_table() возвращает указатель на значение типа unsigned long int.
Однако возвращаемое значение должно ссылаться на массив 4х байтных данных. В реализацию были внесены изменения, согласно которым функция возвращает указатель на unsigned int, unsigned short или unsigned long в зависимости от платформы. На LSB совместимых дистрибутивах возвращаемое значение - указатель на unsigned int.
Комментарий разработчика:
Apr 29, 2012
Fix type mismatch between get_crc_table() and crc_table. …
crc_table is made using a four-byte integer (when that can be
determined). However get_crc_table() returned a pointer to an
unsigned long, which could be eight bytes. This fixes that by
creating a new z_crc_t type for the crc_table.
z_crc_t определен как:
#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) # includeВ дистрибутивах совместимых с LSB UINT_MAX равен 0xffffffffU. Thus return type is a pointer to unsigned int that contradicts LSB. Проблема только существует только на 64-х битной архитектуре, т.к. на 32-битных int и long совпадают.# if (UINT_MAX == 0xffffffffUL) # define Z_U4 unsigned # else # if (ULONG_MAX == 0xffffffffUL) # define Z_U4 unsigned long # else # if (USHRT_MAX == 0xffffffffUL) # define Z_U4 unsigned short # endif # endif # endif #endif #ifdef Z_U4 typedef Z_U4 z_crc_t; #else typedef unsigned long z_crc_t; #endif
Компонент
zlib 1.2.7
Ссылки
происхождение проблемы
обсуждение
[В начало]