[asterisk-bugs] [JIRA] (ASTERISK-24619) Gcc 4.10 fixes in r413589 (1.8) wrongly casts char to unsigned int
Walter Doekes (JIRA)
noreply at issues.asterisk.org
Mon Dec 15 07:31:29 CST 2014
Walter Doekes created ASTERISK-24619:
----------------------------------------
Summary: Gcc 4.10 fixes in r413589 (1.8) wrongly casts char to unsigned int
Key: ASTERISK-24619
URL: https://issues.asterisk.org/jira/browse/ASTERISK-24619
Project: Asterisk
Issue Type: Bug
Security Level: None
Affects Versions: 1.8.32.1, SVN
Reporter: Walter Doekes
Example:
{noformat}
int main() { const char *abc = "åäö"; return (((unsigned) abc[3]) >> 24) == 0 ? 0 : 1; }
{noformat}
yields 1
Or, more visibly:
{noformat}
#include <stdio.h>
int main() {
const char *abc = "åäö";
printf("bad: %02X\n", (unsigned)*abc);
printf("good: %02hhX\n", (unsigned char)*abc);
return 0;
}
{noformat}
yields:
{noformat}
$ ./a.out
bad: FFFFFFC3
good: C3
{noformat}
Unfortunately, the changes in r413589 introduce just that.
E.g.:
{noformat}
$ svn diff -c 413586 > tmp.diff
$ grep '^-.*(unsigned char)' tmp.diff -A1
- sprintf(digest + (idx << 1), "%2.2x", (unsigned char) key[idx]); \
+ sprintf(digest + (idx << 1), "%2.2x", (unsigned) key[idx]); \
--
- sprintf(&addrmac[i], "%.2x", (unsigned char) buf[tmp]);
+ sprintf(&addrmac[i], "%.2x", (unsigned) buf[tmp]);
--
- sprintf(p, "%02X ", (unsigned char)buf[f]);
+ sprintf(p, "%02X ", (unsigned)buf[f]);
--
- out += sprintf(out, "%%%02X", (unsigned char) *ptr);
+ out += sprintf(out, "%%%02X", (unsigned) *ptr);
{noformat}
That's wrong, the compiler warnings should have been fixed using the hh (char) modifier: {{%02hhX}}
Issue was reported by stefan27 via IRC.
--
This message was sent by Atlassian JIRA
(v6.2#6252)
More information about the asterisk-bugs
mailing list