[gcc r17-2313] cobol: Replace NUL input with space, with diagnostic.

"James K. Lowden via Gcc-cvs" <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:fe37b9c1c4ecb5dbb3762755ad1bd6eccf524afd

commit r17-2313-gfe37b9c1c4ecb5dbb3762755ad1bd6eccf524afd
Author: James K. Lowden <[email protected]>
Date:   Thu Jul 9 15:36:50 2026 -0400

    cobol: Replace NUL input with space, with diagnostic.
    
    Old-school COBOL input may embed NUL characters in alphanumeric
    literals. GNU Flex unfortunately treats NUL as end-of-file marker.
    
    Detect the situation in the lexio file-reader.  Replace NUL with
    SPACE, increment error count, and emit message. Fixes RT 3622.
    
            * lexio.h (parse_error_inc): Declare function.
            (struct filespan_t::next_line): Detect and remove NUL,

Diff:
---
 gcc/cobol/lexio.h | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/cobol/lexio.h b/gcc/cobol/lexio.h
index f58470d97e29..222a831fe6d4 100644
--- a/gcc/cobol/lexio.h
+++ b/gcc/cobol/lexio.h
@@ -112,7 +112,7 @@ struct bytespan_t {
   }
 };
 
-// YYLTYPE supplied by cbldiag.h.  Borrowed from parse.h as generated by Bison.
+size_t parse_error_inc();
 
 struct filespan_t : public bytespan_t {
   char *cur, *eol, *quote;
@@ -164,6 +164,19 @@ struct filespan_t : public bytespan_t {
 
     eol = std::find(cur, eodata, '\n');
 
+    char *nul = std::find(cur, eol, '\0');
+    if( nul != eol ) {
+      if( std::any_of( nul, eodata,
+                       []( char ch ) { return ch != '\0'; } ) ) {
+        int icol = nul - cur;
+        fprintf(stderr, "%s:%d:%d: error: NUL character detected in input\n%*s\n",
+                cobol_filename(), int(iline + 1), ++icol,
+                int(eol - cur), cur);
+        parse_error_inc();
+        std::replace(nul, eol, '\0', SPACE);
+      }
+    }
+
     if( eol < eodata ) {
       ++eol;
       ++iline;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.