www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2014/02/20/08:12:09

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
X-Recipient: djgpp AT delorie DOT com
Message-ID: <5305FF1A.4010804@Damon-Family.org>
Date: Thu, 20 Feb 2014 08:11:54 -0500
From: Richard Damon <Richard AT Damon-Family DOT org>
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0
MIME-Version: 1.0
To: djgpp AT delorie DOT com
Subject: Re: DJGPP gcc 4.7.3 and 4.8.2 work inconsistently on type uint32_t.
References: <61118811-548e-4c11-8d04-e73de3c7da86 AT googlegroups DOT com>
In-Reply-To: <61118811-548e-4c11-8d04-e73de3c7da86@googlegroups.com>
X-Provags-ID: V02:K0:RZtC7RBuhQWdSD50ASKQd+ZkkjtS4ob2Cyy4wPqtkXn
Y8HGbIHR6M50H+iAPNWSJzIwmUqak5wolzoP1XWIMt96R1bsru
NFqE0oFLsw57amLyXKb5UlvBRmOaWX5kBE+jntqhU91FqhnhLD
Ice4eeX4FdM9c47N2Wx8EjLT9v3yNlgQz29pRYO4NX5Lt2eniT
dypNmFEli5Kd6/qb6KLHNj4RdPjk+qQTvVNm6inJUBaW8H1JlC
nYltcUkTs/yvOkncpwOB1Lko02rkMOH1AepzXWI5YKeToPHefR
heabIaVS5S2Lt0+J+cqj0kHpnPurMGc+08qwxSb9l7m4+2cLvu
FHCEXjO1U0po3bsfvHMlw8ssmtzWgssf72fgYeeHK
Reply-To: djgpp AT delorie DOT com

On 2/20/14, 4:27 AM, Andrew Wu wrote:
> Hello,
>
> I found that for type uint32_t, DJGPP gcc 4.7.3 and DJGPP gcc 4.8.2 work inconsistently.
>
> File x.c:
>
> ====
> #include <stdint.h>
> #include <stdio.h>
> int main()
> {
>   uint32_t x = 100;
>   printf("Hello %x \n", x);
>   return 0;
> }
> ====
>
> Compile the file with "-Wall" to enable all warnings.
>
>  gcc -Wall -c x.c
>
> If I uses DJGPP gcc 4.7.3, there is no problem.
>
> But if I use DJGPP gcc 4.8.2, there will be warning message:
>
>
> x.c: In function 'main':
> x.c:6:3: warning: format '%x' expects argument of type 'unsigned int', but argument 2 has type 'uint32_t' [-Wformat=]
>    printf("Hello %x \n", x);
>    ^
>
> DJGPP gcc 4.7.3 binary files are from the official DJGPP Zip File Picker :
>
> http://www.delorie.com/djgpp/zip-picker.html
>
> I download and use:
>
> bnu224b.zip
> djdev203.zip
> gcc473b.zip
>
> Other files are not important, so I ignored them.
>
> DJGPP gcc 4.8.2 binary files are downloaded from official FTP's beta directory :
>
> ftp://ftp.delorie.com/pub/djgpp/beta/
>
> I download and use:
>
> bnu224b.zip
> djdev204.zip
> gcc482b.zip
>
> It seems uint32_t type definition is changed between gcc 4.7.3 and 4.8.2?
>
The problem is that by the standard, %x requires a parameter of type
(unsigned) int, and uint32_t  may or may not be of that type. Printing a
uint32_t with a %x format is really a BUG in the program (or at the very
minimum, a dependance on unpromised implementation defined behavior,
which is really just a polite name for bug.

I will admit that it is a common error for people who grew up on 32 bit
machines, as for them int has always been 32 bits, so things always just
worked (even if performing technically undefined behavior if the
implementation decided that uint32_t should be a unsigned long (which
also is 32 bits on most 32 bit machines).

If you want to print out a uint32_t, you should include <inttypes.h> and
use the macro PRIx32as in

printf("Hello %" PRIx32 " \n", x);

-- 
Richard Damon

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019