On 10/12/2016 02:10 PM, Marek Polacek wrote:
While implementing a warning I noticed this in gcov-io.c:

 187   else if (mode == 0)
 188     {
 189       struct stat st;
 190
 191       if (fstat (fd, &st) < 0)
 192         {
 193           fclose (gcov_var.file);
 194           gcov_var.file = 0;
 195           return 0;
 196         }
 197       if (st.st_size != 0)
 198         gcov_var.mode = 1;
 199       else
 200         gcov_var.mode = mode * 2 + 1;
 201     }
 202   else
 203     gcov_var.mode = mode * 2 + 1;

It seems that lines 198 and 200 do the same thing, at line 200 we know that
mode == 0, so we just assign 1.  Should we just remove the condition on line 
197?

The intention seems to be that a negative gcov_var.mode means we're writing, so for a size zero file maybe that's the expected result. But of course none of the existing code is going to expect that.

There are more oddities here...

Before the quoted piece of code, we test for mode > 0, so in line 203 we know that mode is < 0. I don't really see what the "mode * 2 + 1" expression is supposed to do anyway, given that the caller could pass in any positive/negative number and expect the same results as for 1 and -1. I think line 203 should just use -1. There's one further occurrence of that expression which should probably be modified.

The function comment also seems to have an issue:

/* Open a gcov file. NAME is the name of the file to open and MODE
   indicates whether a new file should be created, or an existing file
   opened. If MODE is >= 0 an existing file will be opened, if
   possible, and if MODE is <= 0, a new file will be created. Use
   MODE=0 to attempt to reopen an existing file and then fall back on
   creating a new one.  If MODE < 0, the file will be opened in
   read-only mode.  Otherwise it will be opened for modification.
   Return zero on failure, >0 on opening an existing file and <0 on
   creating a new one.  */

This suggests that with MODE < 0, we'll create a file in read-only mode, which is nonsensical. The code suggests that the comment should read " > 0".


Bernd

Reply via email to