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));