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

            Bug ID: 120621
           Summary: COBOL isn't built with STRICT_WARN
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: cobol
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ro at gcc dot gnu.org
                CC: jklowden at gcc dot gnu.org, rdubner at gcc dot gnu.org
  Target Milestone: ---

I recently noticed that building the COBOL frontend produces quite a number of
warnings, even on Linux/x86_64:

/vol/gcc/src/hg/master/local/gcc/cobol/symbols.cc: In member function ‘char*
cbl_file_t::keys_str() const’:
/vol/gcc/src/hg/master/local/gcc/cobol/symbols.cc:4578:8: warning: writing 1
byte into a region of size 0 [-Wstringop-overflow=]
 4578 |   *p++ = '[';
      |   ~~~~~^~~~~
/vol/gcc/src/hg/master/local/gcc/cobol/symbols.cc:4575:45: note: destination
object of size 0 allocated by ‘xcalloc’
 4575 |   char *output = static_cast<char*>( xcalloc(1, n) ), *p = output;
      |                                      ~~~~~~~^~~~~~
/vol/gcc/src/hg/master/local/gcc/cobol/symbols.cc:4585:8: warning: writing 1
byte into a region of size 0 [-Wstringop-overflow=]
 4585 |   *p++ = ']';
      |   ~~~~~^~~~~
/vol/gcc/src/hg/master/local/gcc/cobol/symbols.cc:4575:45: note: at offset 1
into destination object of size 0 allocated by ‘xcalloc’
 4575 |   char *output = static_cast<char*>( xcalloc(1, n) ), *p = output;
      |                                      ~~~~~~~^~~~~~

There are several more on 32-bit hosts, e.g. Solaris/i386 has

/vol/gcc/src/hg/master/local/gcc/cobol/genapi.cc: In function ‘tree_node*
parser_compile_ecs(const std::vector<long long unsigned int>&)’:
/vol/gcc/src/hg/master/local/gcc/cobol/genapi.cc:960:44: warning: format ‘%ld’
expects argument of type ‘long int’, but argument 4 has type ‘std::vector<long
long unsigned int>::size_type’ {aka ‘unsigned int’} [-Wformat=]
  960 |     snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
ecs.size(), retval);
      |                                          ~~^                 ~~~~~~~~~~
      |                                            |                         |
      |                                            long int                 
std::vector<long long unsigned int>::size_type {aka unsigned int}
      |                                          %d
/vol/gcc/src/hg/master/local/gcc/cobol/genapi.cc:968:44: warning: format ‘%ld’
expects argument of type ‘long int’, but argument 4 has type ‘std::vector<long
long unsigned int>::size_type’ {aka ‘unsigned int’} [-Wformat=]
  968 |     snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
ecs.size(), retval);
      |                                          ~~^                 ~~~~~~~~~~
      |                                            |                         |
      |                                            long int                 
std::vector<long long unsigned int>::size_type {aka unsigned int}
      |                                          %d
/vol/gcc/src/hg/master/local/gcc/cobol/genapi.cc: In function ‘tree_node*
parser_compile_dcls(const std::vector<long long unsigned int>&)’:
/vol/gcc/src/hg/master/local/gcc/cobol/genapi.cc:1007:44: warning: format ‘%ld’
expects argument of type ‘long int’, but argument 4 has type ‘std::vector<long
long unsigned int>::size_type’ {aka ‘unsigned int’} [-Wformat=]
 1007 |     snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
dcls.size(), retval);
      |                                          ~~^                
~~~~~~~~~~~
      |                                            |                          |
      |                                            long int                  
std::vector<long long unsigned int>::size_type {aka unsigned int}
      |                                          %d
/vol/gcc/src/hg/master/local/gcc/cobol/genapi.cc:1015:44: warning: format ‘%ld’
expects argument of type ‘long int’, but argument 4 has type ‘std::vector<long
long unsigned int>::size_type’ {aka ‘unsigned int’} [-Wformat=]
 1015 |     snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
dcls.size(), retval);
      |                                          ~~^                
~~~~~~~~~~~
      |                                            |                          |
      |                                            long int                  
std::vector<long long unsigned int>::size_type {aka unsigned int}
      |                                          %d

Looking closer, I noticed that unlike any other frontend COBOL doesn't enable
STRICT_WARN in gcc/cobol/Make-lang.in.  The others have something like

rust-warn = $(STRICT_WARN)

I guess that should be changed, allowing to catch a couple of issues as in the
other frontends.

Reply via email to