https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117807

            Bug ID: 117807
           Summary: analyzer gets confused by integer promotion
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: analyzer
          Assignee: dmalcolm at gcc dot gnu.org
          Reporter: felix-gcc at fefe dot de
  Target Milestone: ---

Here is my example code:

#include <unistd.h>                                                             
#include <fcntl.h>                                                              

int open_for_reading(int* retfd,const char* filename) {                         
  int fd=open(filename,O_RDONLY);                                               
  if (fd!=-1) {                                                                 
    *retfd=fd;                                                                  
    return 1;                                                                   
  }                                                                             
  return 0;                                                                     
}                                                                               

int open_for_reading_long(signed long long int* d,const char* filename) {       
  long fd=open(filename,O_RDONLY);                                              
  if (fd != -1) {>------// gcc -fanalyze false positive                         
    *d=fd;>-----// no leak, we return in *d                                     
    return 1;                                                                   
  }                                                                             
  return 0;                                                                     
}                                                                               


Run with -fanalyzer gcc will complain that open_for_reading_long contains a
file descriptor leak. The warning goes away if I turn d into an int*, and it
also goes away if I turn fd into an int.

Reply via email to