printf("%lf",...) isn't actually portable - Mailing list pgsql-hackers

From Tom Lane
Subject printf("%lf",...) isn't actually portable
Date
Msg-id 21670.1526769114@sss.pgh.pa.us
Whole thread Raw
List pgsql-hackers
I noticed while poking at the recent ecpg unpleasantness that some
of my older critters were warning about use of %lf conversions in
printf.  Looking into it, I find that current POSIX says the "l"
is a no-op, while SUSv2 says it's undefined.  I think this usage
got into our code as a result of people making false analogies
between scanf and printf conversions.

I think we should just switch these to plain %f, as per attached.

            regards, tom lane

diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c
index 558a8c4..90acf6a 100644
--- a/contrib/pageinspect/btreefuncs.c
+++ b/contrib/pageinspect/btreefuncs.c
@@ -563,7 +563,7 @@ bt_metap(PG_FUNCTION_ARGS)
     if (metad->btm_version == BTREE_VERSION)
     {
         values[j++] = psprintf("%u", metad->btm_oldest_btpo_xact);
-        values[j++] = psprintf("%lf", metad->btm_last_cleanup_num_heap_tuples);
+        values[j++] = psprintf("%f", metad->btm_last_cleanup_num_heap_tuples);
     }
     else
     {
diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml
index 98b6840..f065477 100644
--- a/doc/src/sgml/ecpg.sgml
+++ b/doc/src/sgml/ecpg.sgml
@@ -1678,7 +1678,7 @@ while (1)
     <para>
      Here is an example using the data type <type>complex</type> from
      the example in <xref linkend="xtypes"/>.  The external string
-     representation of that type is <literal>(%lf,%lf)</literal>,
+     representation of that type is <literal>(%f,%f)</literal>,
      which is defined in the
      functions <function>complex_in()</function>
      and <function>complex_out()</function> functions
diff --git a/src/backend/access/rmgrdesc/nbtdesc.c b/src/backend/access/rmgrdesc/nbtdesc.c
index 1590d67..5c44571 100644
--- a/src/backend/access/rmgrdesc/nbtdesc.c
+++ b/src/backend/access/rmgrdesc/nbtdesc.c
@@ -100,7 +100,7 @@ btree_desc(StringInfo buf, XLogReaderState *record)
             {
                 xl_btree_metadata *xlrec = (xl_btree_metadata *) rec;

-                appendStringInfo(buf, "oldest_btpo_xact %u; last_cleanup_num_heap_tuples: %lf",
+                appendStringInfo(buf, "oldest_btpo_xact %u; last_cleanup_num_heap_tuples: %f",
                                  xlrec->oldest_btpo_xact,
                                  xlrec->last_cleanup_num_heap_tuples);
                 break;
diff --git a/src/interfaces/ecpg/test/compat_informix/sqlda.pgc b/src/interfaces/ecpg/test/compat_informix/sqlda.pgc
index 423ce41..87e0110 100644
--- a/src/interfaces/ecpg/test/compat_informix/sqlda.pgc
+++ b/src/interfaces/ecpg/test/compat_informix/sqlda.pgc
@@ -37,7 +37,7 @@ dump_sqlda(sqlda_t *sqlda)
             printf("name sqlda descriptor: '%s' value %d\n", sqlda->sqlvar[i].sqlname, *(int
*)sqlda->sqlvar[i].sqldata);
             break;
         case SQLFLOAT:
-            printf("name sqlda descriptor: '%s' value %lf\n", sqlda->sqlvar[i].sqlname, *(double
*)sqlda->sqlvar[i].sqldata);
+            printf("name sqlda descriptor: '%s' value %f\n", sqlda->sqlvar[i].sqlname, *(double
*)sqlda->sqlvar[i].sqldata);
             break;
         case SQLDECIMAL:
             {
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
index fa2e569..ad3188d 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
@@ -142,7 +142,7 @@ dump_sqlda(sqlda_t *sqlda)
             printf("name sqlda descriptor: '%s' value %d\n", sqlda->sqlvar[i].sqlname, *(int
*)sqlda->sqlvar[i].sqldata);
             break;
         case SQLFLOAT:
-            printf("name sqlda descriptor: '%s' value %lf\n", sqlda->sqlvar[i].sqlname, *(double
*)sqlda->sqlvar[i].sqldata);
+            printf("name sqlda descriptor: '%s' value %f\n", sqlda->sqlvar[i].sqlname, *(double
*)sqlda->sqlvar[i].sqldata);
             break;
         case SQLDECIMAL:
             {
diff --git a/src/interfaces/ecpg/test/expected/preproc-outofscope.c
b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
index f4676a0..ef4dada 100644
--- a/src/interfaces/ecpg/test/expected/preproc-outofscope.c
+++ b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
@@ -337,7 +337,7 @@ if (sqlca.sqlcode < 0) exit (1);}
         get_record1();
         if (sqlca.sqlcode == ECPG_NOT_FOUND)
             break;
-        printf("id=%d%s t='%s'%s d1=%lf%s d2=%lf%s c = '%s'%s\n",
+        printf("id=%d%s t='%s'%s d1=%f%s d2=%f%s c = '%s'%s\n",
             myvar->id, mynullvar->id ? " (NULL)" : "",
             myvar->t, mynullvar->t ? " (NULL)" : "",
             myvar->d1, mynullvar->d1 ? " (NULL)" : "",
diff --git a/src/interfaces/ecpg/test/expected/sql-sqlda.c b/src/interfaces/ecpg/test/expected/sql-sqlda.c
index 81d26b3..090aaf1 100644
--- a/src/interfaces/ecpg/test/expected/sql-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/sql-sqlda.c
@@ -158,7 +158,7 @@ dump_sqlda(sqlda_t *sqlda)
             break;
 #endif
         case ECPGt_double:
-            printf("name sqlda descriptor: '%s' value %lf\n", sqlda->sqlvar[i].sqlname.data, *(double
*)sqlda->sqlvar[i].sqldata);
+            printf("name sqlda descriptor: '%s' value %f\n", sqlda->sqlvar[i].sqlname.data, *(double
*)sqlda->sqlvar[i].sqldata);
             break;
         case ECPGt_numeric:
             {
diff --git a/src/interfaces/ecpg/test/preproc/outofscope.pgc b/src/interfaces/ecpg/test/preproc/outofscope.pgc
index aae5325..b03743c 100644
--- a/src/interfaces/ecpg/test/preproc/outofscope.pgc
+++ b/src/interfaces/ecpg/test/preproc/outofscope.pgc
@@ -101,7 +101,7 @@ main (void)
         get_record1();
         if (sqlca.sqlcode == ECPG_NOT_FOUND)
             break;
-        printf("id=%d%s t='%s'%s d1=%lf%s d2=%lf%s c = '%s'%s\n",
+        printf("id=%d%s t='%s'%s d1=%f%s d2=%f%s c = '%s'%s\n",
             myvar->id, mynullvar->id ? " (NULL)" : "",
             myvar->t, mynullvar->t ? " (NULL)" : "",
             myvar->d1, mynullvar->d1 ? " (NULL)" : "",
diff --git a/src/interfaces/ecpg/test/sql/sqlda.pgc b/src/interfaces/ecpg/test/sql/sqlda.pgc
index 0f2059f..2ea5121 100644
--- a/src/interfaces/ecpg/test/sql/sqlda.pgc
+++ b/src/interfaces/ecpg/test/sql/sqlda.pgc
@@ -45,7 +45,7 @@ dump_sqlda(sqlda_t *sqlda)
             break;
 #endif
         case ECPGt_double:
-            printf("name sqlda descriptor: '%s' value %lf\n", sqlda->sqlvar[i].sqlname.data, *(double
*)sqlda->sqlvar[i].sqldata);
+            printf("name sqlda descriptor: '%s' value %f\n", sqlda->sqlvar[i].sqlname.data, *(double
*)sqlda->sqlvar[i].sqldata);
             break;
         case ECPGt_numeric:
             {

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: FindDefinedSymbol() is subtly broken
Next
From: Andrew Gierth
Date:
Subject: Fix for FETCH FIRST syntax problems