]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cobol: Eliminate errors that cause valgrind messages.
authorRobert Dubner <rdubner@symas.com>
Wed, 20 Aug 2025 03:08:48 +0000 (23:08 -0400)
committerRobert Dubner <rdubner@symas.com>
Wed, 20 Aug 2025 03:29:43 +0000 (23:29 -0400)
gcc/cobol/ChangeLog:

* genutil.cc (get_binary_value): Fix a comment.
* parse.y: udf_args_valid(): Fix loc calculation.
* symbols.cc (assert): extend_66_capacity(): Avoid assert(e < e2) in
-O0 build until symbol_table expansion is fixed.

libgcobol/ChangeLog:

* libgcobol.cc (format_for_display_internal): Handle NumericDisplay
properly.
(compare_88): Fix memory access error.
(__gg__unstring): Likewise.

gcc/cobol/genutil.cc
gcc/cobol/parse.y
gcc/cobol/symbols.cc
libgcobol/libgcobol.cc

index 3682b107c5ad66101c5195cbdd1eb0804a4a3e2d..4b296e46e8776205a2eb17edf977bdf9e88b9274 100644 (file)
@@ -819,7 +819,7 @@ get_binary_value( tree value,
           }
         ELSE
           {
-          // We are dealing with an ordinary NumericEdited value
+          // We are dealing with an ordinary NumericDisplay value
           gg_assign(pointer, source_address);
 
           if( rdigits )
index 59cc64ddeca4637a7e03a106df68a82f50ab89c6..039cb957de0c1a26a0928480bd29a75fd6b2225a 100644 (file)
@@ -11959,7 +11959,10 @@ current_t::udf_args_valid( const cbl_label_t *L,
     if( arg.field ) { // else omitted
       auto tgt = cbl_field_of(symbol_at(udf.linkage_fields.at(i).isym));
       if( ! valid_move(tgt, arg.field) ) {
-       auto loc = symbol_field_location(field_index(arg.field));
+       auto loc = current_location;
+        if( ! is_temporary(arg.field) ) {
+          loc = symbol_field_location(field_index(arg.field));
+        }
        error_msg(loc, "FUNCTION %s argument %zu, '%s' cannot be passed to %s, type %s",
                  L->name, i, arg.field->pretty_name(),
                  tgt->pretty_name(), 3 + cbl_field_type_str(tgt->type) );
index f2cd1b55f802c045f20d73fb2a5f7a626c1a33eb..bbe99b6801f6a38c84d2811fd0c97cceb170efd9 100644 (file)
@@ -1598,7 +1598,17 @@ extend_66_capacity( cbl_field_t *alias ) {
   symbol_elem_t *e = symbol_at(alias->parent);
   symbol_elem_t *e2 =
     reinterpret_cast<symbol_elem_t*>(const_cast<char*>(alias->data.picture));
+#ifndef __OPTIMIZE__
+#pragma message "The assert(e < e2) needs fixing"
+  // The following assert fails when valgrind is involved.  This is the known
+  // problem of expecting mmap() to put new memory maps after older memory
+  // maps; that assumption fails when valgrind is involved.
+
+  // For now I am defeating the assert when using -O0 so that I can run the
+  // NIST "make valgrind" tests.  But this should be fixed so that the
+  // symbol table index is used, not the entry locations.
   assert(e < e2);
+#endif
   alias->data.picture = NULL;
 
   capacity_of cap;
index 427625366810d35c31e6c2428cc4955e10b44a00..1b54cfdc3894d8391be10f553489e9741bee0e2b 100644 (file)
@@ -2990,6 +2990,9 @@ format_for_display_internal(char **dest,
       {
       // Because a NumericDisplay can have any damned thing as a character,
       // we are going force things that aren't digits to display as '0'
+
+      // 0xFF is an exception, so that a HIGH-VALUE in a numeric display shows
+      // up in a unique way.
       static const uint8_t ascii_chars[256] =
         {
         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0x00
@@ -3007,7 +3010,7 @@ format_for_display_internal(char **dest,
         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xc0
         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xd0
         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xe0
-        '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xf0
+        '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 0xFF, // 0xf0
         };
       static const uint8_t ebcdic_chars[256] =
         {
@@ -3026,7 +3029,7 @@ format_for_display_internal(char **dest,
         0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xc0
         0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xd0
         0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xe0
-        0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xf0
+        0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xFF, // 0xf0
         } ;
 
       // We are going to make use of fact that a NumericDisplay's data is
@@ -3114,22 +3117,20 @@ format_for_display_internal(char **dest,
 
           // But when it isn't HIGH-VALUE, we don't want to see the effects
           // of the internal sign.
-          if( (*dest)[index-1] != (char)DEGENERATE_HIGH_VALUE )
-            {
-            // Another tricky thing, though, is that for various reasons
-            // the string of digits might not be digits.  There can be
-            // REDEFINES, or the middle of the number might have been changed
-            // with an INITIALIZE into spaces.  But we do want numbers to
-            // look like numbers.  So, we do what we can:
 
-            if( internal_is_ebcdic )
-              {
-              ch = ebcdic_chars[ch];
-              }
-            else
-              {
-              ch = ascii_chars[ch];
-              }
+          // Another tricky thing, though, is that for various reasons
+          // the string of digits might not be digits.  There can be
+          // REDEFINES, or the middle of the number might have been changed
+          // with an INITIALIZE into spaces.  But we do want numbers to
+          // look like numbers.  So, we do what we can:
+
+          if( internal_is_ebcdic )
+            {
+            ch = ebcdic_chars[ch];
+            }
+          else
+            {
+            ch = ascii_chars[ch];
             }
           (*dest)[index++] = ch;
           }
@@ -3151,16 +3152,13 @@ format_for_display_internal(char **dest,
           for(int i=0; i<rdigits; i++ )
             {
             unsigned char ch = *running_location++;
-              if( (*dest)[index-1] != (char)DEGENERATE_HIGH_VALUE )
-                {
-              if( internal_is_ebcdic )
-                {
-                ch = ebcdic_chars[ch];
-                }
-              else
-                {
-                ch = ascii_chars[ch];
-                }
+            if( internal_is_ebcdic )
+              {
+              ch = ebcdic_chars[ch];
+              }
+            else
+              {
+              ch = ascii_chars[ch];
               }
             (*dest)[index++] = ch;
             }
@@ -3664,7 +3662,9 @@ compare_88( const char    *list,
     cmpval = cstrncmp (test,
                       PTRCAST(char, conditional_location),
                       conditional_length);
-    if( cmpval == 0 && (int)strlen(test) != conditional_length )
+
+//    if( cmpval == 0 && (int)strlen(test) != conditional_length )
+    if( cmpval == 0 && test_len != conditional_length )
       {
       // When strncmp returns 0, the actual smaller string is the
       // the shorter of the two:
@@ -11058,9 +11058,12 @@ __gg__unstring( const cblc_field_t *id1,        // The string being unstring
       }
 
     // Update the state variables:
-    pointer += examined + id2_s[ifound];
     tally += 1;
     nreceiver += 1;
+    if( ifound >= 0 )
+      {
+      pointer += examined + id2_s[ifound];
+      }
     }
 
 done: