Программы на C++. Форум разработчиков
Anonymous
Возможная потеря данных при преобразовании (предупреждение C4244)
Сообщение
Anonymous » 10 фев 2026, 22:09
Я использую старый компилятор, который допустил ошибку в диагностике предупреждений.
Код: Выделить всё
typedef unsigned char uint8_t; // 8-bit byte
typedef unsigned int uint32_t; // 32-bit word (change to "long" for 16-bit machines)
typedef struct _sha256_ctx_t
{
uint8_t data[64];
uint32_t data_len;
unsigned __int64 bit_len; // unsigned long long
uint32_t state[8];
} sha256_ctx_t;
void crypto_sha256_final(sha256_ctx_t *ctx, uint8_t *digest)
{
uint32_t i;
i = ctx->data_len;
// Append to the padding the total message's length in bits and transform.
ctx->bit_len += ctx->data_len * 8;
ctx->data[63] = ctx->bit_len; // LINE 156 IS HERE!
ctx->data[62] = ctx->bit_len >> 8;
ctx->data[61] = ctx->bit_len >> 16;
ctx->data[60] = ctx->bit_len >> 24;
ctx->data[59] = ctx->bit_len >> 32;
ctx->data[58] = ctx->bit_len >> 40;
ctx->data[57] = ctx->bit_len >> 48;
ctx->data[56] = ctx->bit_len >> 56; // LINE 163 IS HERE!
local_sha256_transform(ctx, ctx->data);
// Since this implementation uses little endian byte ordering and SHA uses big endian,
// reverse all the bytes when copying the final state to the output digest.
for (i = 0; i < 4; ++i) {
digest[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
digest[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
digest[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
digest[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
digest[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
digest[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
digest[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
digest[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
}
}
Ошибка в строках 156–163:
SHA256.cpp(156) : предупреждение C4244: '=' : преобразование из 'unsigned __int64' в 'unsigned char', возможная потеря данных
Я думаю, этот старый компилятор этого не понимает добавление его с 0xFF сужает результат до байта. Как обойти ложное предупреждение?
Источник кода.
Подробнее здесь:
https://stackoverflow.com/questions/722 ... ning-c4244
1770750551
Anonymous
Я использую старый компилятор, который допустил ошибку в диагностике предупреждений.[code] typedef unsigned char uint8_t; // 8-bit byte typedef unsigned int uint32_t; // 32-bit word (change to "long" for 16-bit machines) typedef struct _sha256_ctx_t { uint8_t data[64]; uint32_t data_len; unsigned __int64 bit_len; // unsigned long long uint32_t state[8]; } sha256_ctx_t; void crypto_sha256_final(sha256_ctx_t *ctx, uint8_t *digest) { uint32_t i; i = ctx->data_len; // Append to the padding the total message's length in bits and transform. ctx->bit_len += ctx->data_len * 8; ctx->data[63] = ctx->bit_len; // LINE 156 IS HERE! ctx->data[62] = ctx->bit_len >> 8; ctx->data[61] = ctx->bit_len >> 16; ctx->data[60] = ctx->bit_len >> 24; ctx->data[59] = ctx->bit_len >> 32; ctx->data[58] = ctx->bit_len >> 40; ctx->data[57] = ctx->bit_len >> 48; ctx->data[56] = ctx->bit_len >> 56; // LINE 163 IS HERE! local_sha256_transform(ctx, ctx->data); // Since this implementation uses little endian byte ordering and SHA uses big endian, // reverse all the bytes when copying the final state to the output digest. for (i = 0; i < 4; ++i) { digest[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff; digest[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff; digest[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff; digest[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff; digest[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff; digest[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff; digest[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff; digest[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff; } } [/code] Ошибка в строках 156–163: SHA256.cpp(156) : предупреждение C4244: '=' : преобразование из 'unsigned __int64' в 'unsigned char', возможная потеря данных Я думаю, этот старый компилятор этого не понимает добавление его с 0xFF сужает результат до байта. Как обойти ложное предупреждение? Источник кода. Подробнее здесь: [url]https://stackoverflow.com/questions/72204397/possible-conversion-loss-of-data-warning-c4244[/url]