Подробности

[В начало]

Проблема в реализации № 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 
#  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
В дистрибутивах совместимых с LSB UINT_MAX равен 0xffffffffU. Thus return type is a pointer to unsigned int that contradicts LSB.
Проблема только существует только на 64-х битной архитектуре, т.к. на 32-битных int и long совпадают.

Компонент

zlib 1.2.7

Ссылки

происхождение проблемы
обсуждение

[В начало]