Isso parece ser um bug nessa implementação de hexdump
.
A função responsável é
print(struct hexdump_pr *pr, unsigned char *bp)
em hexdump-display.c
. Ele copia o número correto de bytes em uma variável adequada, para que a extensão de sinal possa acontecer ao passar o valor para printf()
. Mas para bytes simples, não incomoda - apenas desreferencia o ponteiro, que era para um caractere não assinado .
case F_INT: { short sval; /* int16_t */ int ival; /* int32_t */ long long Lval; /* int64_t, int64_t */ switch(pr->bcnt) { case 1: printf(pr->fmt, (unsigned long long) *bp); break; case 2: memmove(&sval, bp, sizeof(sval)); printf(pr->fmt, (unsigned long long) sval); break;
Para corrigir, corrija a função para usar a mesma abordagem "copiar para variável local":
--- text-utils/hexdump-display.c.orig 2015-10-05 15:18:43.458759033 +0100 +++ text-utils/hexdump-display.c 2016-08-19 14:58:35.507705329 +0100 @@ -146,13 +146,15 @@ } case F_INT: { + char cval; /* int8_t */ short sval; /* int16_t */ int ival; /* int32_t */ long long Lval; /* int64_t, int64_t */ switch(pr->bcnt) { case 1: - printf(pr->fmt, (unsigned long long) *bp); + memmove(&cval, bp, sizeof(cval)); + printf(pr->fmt, (unsigned long long) cval); break; case 2: memmove(&sval, bp, sizeof(sval));