Detect format-string mistakes in the libpq_pipeline test module.
authorTom Lane <[email protected]>
Thu, 15 Sep 2022 21:17:53 +0000 (17:17 -0400)
committerTom Lane <[email protected]>
Thu, 15 Sep 2022 21:17:53 +0000 (17:17 -0400)
I happened to notice that libpq_pipeline's private implementation
of pg_fatal lacked any pg_attribute_printf decoration.  Indeed,
adding that turned up a mistake!  We'd likely never have noticed
because the error exits in this code are unlikely to get hit,
but still, it's a bug.

We're so used to having the compiler check this stuff for us that
a printf-like function without pg_attribute_printf is a land mine.
I wonder if there is a way to detect such omissions.

Back-patch to v14 where this code came in.

src/test/modules/libpq_pipeline/libpq_pipeline.c

index 0407c4a8c004467a22b0e85ab95b14114eb71816..6600ebb0c29f35677461d0410fae7ea1defdbe60 100644 (file)
@@ -26,6 +26,8 @@
 
 
 static void exit_nicely(PGconn *conn);
+static void pg_attribute_noreturn() pg_fatal_impl(int line, const char *fmt,...)
+           pg_attribute_printf(2, 3);
 static bool process_result(PGconn *conn, PGresult *res, int results,
                           int numsent);
 
@@ -914,7 +916,7 @@ test_prepared(PGconn *conn)
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
        pg_fatal("expected COMMAND_OK, got %s", PQresStatus(PQresultStatus(res)));
    if (PQnfields(res) != lengthof(expected_oids))
-       pg_fatal("expected %d columns, got %d",
+       pg_fatal("expected %zd columns, got %d",
                 lengthof(expected_oids), PQnfields(res));
    for (int i = 0; i < PQnfields(res); i++)
    {