avoid ignoring the result of i_io_getc()
authorTony Cook <tony@develop-help.com>
Sat, 5 Jan 2019 03:33:22 +0000 (14:33 +1100)
committerTony Cook <tony@develop-help.com>
Sat, 5 Jan 2019 03:33:22 +0000 (14:33 +1100)
Coverity complained about *(ig->read_ptr++) because the result of the *
operator was ignored, which was deliberate.

I could simply had added a void cast, but given i_io_peekc(),
I could see a macro that skips the * being simpler to read, adding
i_io_nextc(), which is exposed as the nextc() method on Imager::IO
objects.

Changes
Imager.xs
iolayert.h
lib/Imager/IO.pod
pnm.c

diff --git a/Changes b/Changes
index 5d31334..31b4d7f 100644 (file)
--- a/Changes
+++ b/Changes
@@ -99,6 +99,9 @@ High severity:
  - error diffusion now validates a custom error diffusion map and reports
    an error if it's bad.  CID 185288.
 
  - error diffusion now validates a custom error diffusion map and reports
    an error if it's bad.  CID 185288.
 
+ - avoid discarding the value of i_io_getc() when scanning numbers in
+   pnm.c.  CID 185293.
+
 [1] The first two build submissions ended up at the end of a ~400
 build queue, and seemed to have been cancelled by Coverity.  A build
 submitted on NYE went through in minutes.
 [1] The first two build submissions ended up at the end of a ~400
 build queue, and seemed to have been cancelled by Coverity.  A build
 submitted on NYE went through in minutes.
index 2ff3c52..cac322d 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -1514,6 +1514,10 @@ int
 i_io_getc(ig)
        Imager::IO ig
 
 i_io_getc(ig)
        Imager::IO ig
 
+void
+i_io_nextc(ig)
+       Imager::IO ig
+
 int
 i_io_putc(ig, c)
        Imager::IO ig
 int
 i_io_putc(ig, c)
        Imager::IO ig
index d2dbb4d..8d19451 100644 (file)
@@ -90,6 +90,10 @@ struct i_io_glue_t {
   ((ig)->read_ptr < (ig)->read_end ? \
      *((ig)->read_ptr++) : \
      i_io_getc_imp(ig))
   ((ig)->read_ptr < (ig)->read_end ? \
      *((ig)->read_ptr++) : \
      i_io_getc_imp(ig))
+#define i_io_nextc(ig) \
+  ((void)((ig)->read_ptr < (ig)->read_end ?    \
+         ((ig)->read_ptr++, 0) :               \
+         i_io_getc_imp(ig)))
 #define i_io_peekc(ig) \
   ((ig)->read_ptr < (ig)->read_end ? \
    *((ig)->read_ptr) :              \
 #define i_io_peekc(ig) \
   ((ig)->read_ptr < (ig)->read_end ? \
    *((ig)->read_ptr) :              \
index 1d0501e..487c392 100644 (file)
@@ -149,6 +149,12 @@ Returns the ordinal of the byte or -1 on error or end of file.
     print chr($c);
   }
 
     print chr($c);
   }
 
+=item nextc()
+
+Discard the next byte from the stream.
+
+Returns nothing.
+
 =item gets()
 
 =item gets($max_size)
 =item gets()
 
 =item gets($max_size)
diff --git a/pnm.c b/pnm.c
index 15fa4bb..970994b 100644 (file)
--- a/pnm.c
+++ b/pnm.c
@@ -133,7 +133,7 @@ gnum(io_glue *ig, int *i) {
       return 0;
     }
     *i = work;
       return 0;
     }
     *i = work;
-    i_io_getc(ig);
+    i_io_nextc(ig);
   }
 
   return 1;
   }
 
   return 1;