On Fri, Nov 08, 2019 at 04:25:07PM +0000, p...@hermes.cam.ac.uk wrote:
> On Thu, 7 Nov 2019, Petr Pisar via Pcre-dev wrote:
> 
> > I can see GCC 4.8.5 prints these warnings on 32-bit PowerPC:
> > 
> > gcc -DHAVE_CONFIG_H -I. -I./src  "-I./src"     -pthread -O2 -g -pipe -Wall 
> > -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong 
> > --param=ssp-buffer-size=4 -grecord-gcc-switches   -m32 -mcpu=power7 
> > -mtune=power7 -c -o src/pcre2test-pcre2test.o `test -f 'src/pcre2test.c' || 
> > echo './'`src/pcre2test.c
> > [...]
> > src/pcre2test.c: In function 'process_pattern':
> > src/pcre2test.c:5212:13: warning: format '%lu' expects argument of type 
> > 'long unsigned int', but argument 3 has type 'int' [-Wformat=]
> >              "opening quote is at offset %" PTR_FORM ".\n", pq - buffer - 
> > 2);
> 
> I am going to need some help here. The PTR_FORM macro is set to the 
> appropriate print format for pointers. It is currently defined like 
> this:
> 
> /* VC and older compilers don't support %td or %zu, and even some that claim 
> to
> be C99 don't support it (hence DISABLE_PERCENT_ZT). */
> 
> #if defined(_MSC_VER) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 
> 199901L || defined(DISABLE_PERCENT_ZT)
> #define PTR_FORM "lu"
> #define SIZ_FORM "lu"
> #define SIZ_CAST (unsigned long int)
> #else
> #define PTR_FORM "td"
> #define SIZ_FORM "zu"
> #define SIZ_CAST
> #endif
> 
> I presume you are seeing %lu because gcc 4.8.5 triggers the 
> __STDC_VERSION__ test.

Yes. GCC 4.8.5 defaults to -std=gnu90 and __STDC_VERSION__ is not defined
there. Recent GCC defaults to gnu17 and __STDC_VERSION__ is "201710L".

> What is the best way (compatible with 4.8.5) to 
> test for being in a 32-bit system at preprocessor time? Is 
> 
The issue is that 32-bit integers do not mean 32-bit pointers. E.g. MIPS64
n32 ABI and AMD64 x32 ABI have 64-bit integers but 32-bit pointers.

GCC provides __SIZEOF_POINTER__ macro, but I don't think there is any
standard for that.

A portable way requires testing a sizeof() operator output in ./configure
script. But that needs executing the compiled code and that would be problem
when crosscompiling. 

> #if LONG_MAX == 2147483647
> 
> the right way to do it? If so, then PTR_FORM and SIZ_FORM can be defined
> as "u" when that test is true. Presumably the cast is OK.
> 
Accordig to my tests with GCC and glibc for Linux, LONG_MAX indicates size of
integers correctly. But I don't have any other compilers or platforms
available. Web search reveals that some Windows systems (LLP64 model) have
long int shorter than a pointer
<http://infocenter.arm.com/help/topic/com.arm.doc.dai0490a/ar01s01.html>.

Frankly I don't believe there is a way of solving it and I'd just keep the
warning there. Using C99 conformant compilers is the correct way. E.g. passing
-std=c99 to GCC with glibc fixes the warning. I'd just document it somwehere
in README or in source code near the PTR_FORM macro definition.

-- Petr

Attachment: signature.asc
Description: PGP signature

-- 
## List details at https://lists.exim.org/mailman/listinfo/pcre-dev 

Reply via email to