Thanks Charles. Applied as r12559. Tim.
On Fri, Feb 27, 2009 at 05:32:09PM +0000, Charles Jardine wrote: > On 26/02/09 16:31, Charles Jardine wrote: >> I have built a 64 bit version of Perl 5.10.0 under SLES 10 (x86-64). >> I am now installing DBI and DBD::Oracle. >> >> Both of these modules produce alarming warnings at compile time. >> E.g. > >> DBI.xs: In function ‘dbih_setup_fbav’: >> DBI.xs:1549: warning: format ‘%ld’ expects type ‘long int’, but argument 3 >> has type ‘int’ > > [snip] > >> I wondered why I had never seen this before. It turns out that >> Perl 5.10.0 has an improvement in this area. For gcc, the >> declaration of PerlIO_printf has been enhanced by the addition >> of '__attribute__((format(__printf__,2,3)))'. This, for the >> first time, allows gcc to check the types of PerlIO_printf's arguments. > > I have now looked at the DBI situation more carefully. The new warnings > have revealed that there are a very small number cases where %ld or > %lx format elements have been used without the requisite casting > of arguments. The omissions have probably done no damage on 32-bit > platforms, but may have led to incorrect trace output on some 64-bit > architectures. > > I attach a patch against DBI-1.607 to fix these micro-bugs. > > While I was there, on line 888 of DBI.xs, I have interchanged the > order of two arguments. I believe this fixes a bug in the tracing > of set_trace itself. > > -- > Charles Jardine - Computing Service, University of Cambridge > [email protected] Tel: +44 1223 334506, Fax: +44 1223 334679 > diff -r -u DBI-1.607/DBI.xs DBI-1.607.patched/DBI.xs > --- DBI-1.607/DBI.xs 2008-07-22 21:47:32.000000000 +0100 > +++ DBI-1.607.patched/DBI.xs 2009-02-27 16:45:19.150114514 +0000 > @@ -884,7 +884,7 @@ > neatsvpv(h,0), > (long)(level & DBIc_TRACE_FLAGS_MASK), > (long)(level & DBIc_TRACE_LEVEL_MASK), > - DBIc_TRACE_LEVEL(imp_xxh), DBIc_TRACE_FLAGS(imp_xxh), > + (long)DBIc_TRACE_FLAGS(imp_xxh), > (long)DBIc_TRACE_LEVEL(imp_xxh), > XS_VERSION, dbi_build_opt, (int)PerlProc_getpid()); > if (!PL_dowarn) > PerlIO_printf(DBIc_LOGPIO(imp_xxh)," Note: perl is running > without the recommended perl -w option\n"); > @@ -1546,14 +1546,14 @@ > return av; > /* we need to adjust the size of the array */ > if (DBIc_TRACE_LEVEL(imp_sth) >= 2) > - PerlIO_printf(DBILOGFP," dbih_setup_fbav realloc from %ld to > %ld fields\n", av_len(av)+1, i); > + PerlIO_printf(DBILOGFP," dbih_setup_fbav realloc from %ld to > %ld fields\n", (long)(av_len(av)+1), (long)i); > SvREADONLY_off(av); > if (i < av_len(av)+1) /* trim to size if too big */ > av_fill(av, i-1); > } > else { > if (DBIc_TRACE_LEVEL(imp_sth) >= 5) > - PerlIO_printf(DBILOGFP," dbih_setup_fbav alloc for %ld > fields\n", i); > + PerlIO_printf(DBILOGFP," dbih_setup_fbav alloc for %ld > fields\n", (long)i); > av = newAV(); > DBIc_FIELDS_AV(imp_sth) = av; > > @@ -1567,7 +1567,7 @@ > while(i--) /* field 1 stored at index 0 */ > av_store(av, i, newSV(0)); > if (DBIc_TRACE_LEVEL(imp_sth) >= 6) > - PerlIO_printf(DBILOGFP," dbih_setup_fbav now %ld fields\n", > av_len(av)+1); > + PerlIO_printf(DBILOGFP," dbih_setup_fbav now %ld fields\n", > (long)(av_len(av)+1)); > SvREADONLY_on(av); /* protect against shift @$row etc */ > return av; > } > diff -r -u DBI-1.607/DBIXS.h DBI-1.607.patched/DBIXS.h > --- DBI-1.607/DBIXS.h 2008-05-28 14:01:29.000000000 +0100 > +++ DBI-1.607.patched/DBIXS.h 2009-02-27 16:30:18.343030577 +0000 > @@ -304,7 +304,8 @@ > if (!DBIc_ACTIVE(imp) && ph_com && !dirty \ > && ++DBIc_ACTIVE_KIDS(ph_com) > DBIc_KIDS(ph_com)) \ > croak("panic: DBI active kids (%ld) > kids (%ld)", \ > - DBIc_ACTIVE_KIDS(ph_com), DBIc_KIDS(ph_com)); \ > + (long)DBIc_ACTIVE_KIDS(ph_com), \ > + (long)DBIc_KIDS(ph_com)); \ > DBIc_FLAGS(imp) |= DBIcf_ACTIVE; \ > } while(0) > #define DBIc_ACTIVE_off(imp) /* adjust parent's active kid count */ \ > @@ -314,7 +315,8 @@ > && (--DBIc_ACTIVE_KIDS(ph_com) > DBIc_KIDS(ph_com) \ > || DBIc_ACTIVE_KIDS(ph_com) < 0) ) \ > croak("panic: DBI active kids (%ld) < 0 or > kids (%ld)", \ > - DBIc_ACTIVE_KIDS(ph_com), DBIc_KIDS(ph_com)); \ > + (long)DBIc_ACTIVE_KIDS(ph_com), \ > + (long)DBIc_KIDS(ph_com)); \ > DBIc_FLAGS(imp) &= ~DBIcf_ACTIVE; \ > } while(0) >
