[asterisk-bugs] [JIRA] (ASTERISK-24619) [patch]Gcc 4.10 fixes in r413589 (1.8) wrongly casts char to unsigned int

Rusty Newton (JIRA) noreply at issues.asterisk.org
Mon Dec 15 09:55:29 CST 2014


     [ https://issues.asterisk.org/jira/browse/ASTERISK-24619?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rusty Newton updated ASTERISK-24619:
------------------------------------

    Summary: [patch]Gcc 4.10 fixes in r413589 (1.8) wrongly casts char to unsigned int  (was: Gcc 4.10 fixes in r413589 (1.8) wrongly casts char to unsigned int)

> [patch]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
>          Components: Core/General
>    Affects Versions: SVN, 1.8.32.1
>            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