>From 1e4dee2dae0ad08fecb50dcced3d00c6cfffd932 Mon Sep 17 00:00:00 2001 From: Robert Dubner mailto:rdub...@symas.com Date: Sun, 11 May 2025 13:43:32 -0400 Subject: [PATCH] cobol: Eliminate padding bytes from cbl_declarative_t. [PR119377]
By changing the type of a variable in the cbl_declarative_t structure from "bool" to "uint32_t", three uninitialized padding bytes were turned into initialized bytes. This eliminates the valgrind error caused by those uninitialized values. This is an interim fix, which expediently eliminates the valgrind problem. The underlying design flaw, which involves turning a host-side C++ structure into a run-time data block, is slated for complete replacement in the next few weeks. libgcobol/ChangeLog: PR cobol/119377 * common-defs.h: (struct cbl_declaratives_t): Change "bool global" to "uint32_t global". --- libgcobol/common-defs.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libgcobol/common-defs.h b/libgcobol/common-defs.h index 026f377e74b2..e3471c5ccc3d 100644 --- a/libgcobol/common-defs.h +++ b/libgcobol/common-defs.h @@ -458,11 +458,25 @@ struct cbl_enabled_exception_t { struct cbl_declarative_t { enum { files_max = 16 }; size_t section; // implies program - bool global; + uint32_t global; // See the note below ec_type_t type; uint32_t nfile, files[files_max]; cbl_file_mode_t mode; +/* The ::global member originally was "bool global". A bool, however, occupies + only one byte of storage. The structure, in turn, is constructed on + four-byte boundaries for members, so there were three padding bytes between + the single byte of global and the ::type member. + + When used to create a "blob", where the structure was treated as a stream + of bytes that were used to create a constructor for an array of bytes, + valgrind noticed that those three padding bytes were not initialized, and + generated the appropriate error message. This made it hard to find other + problems. + + Changing the declaration from "bool" to "uint32_t" seems to have eliminated + the valgrind error without affecting overall performance. */ + cbl_declarative_t( cbl_file_mode_t mode = file_mode_none_e ) : section(0), global(false) , type(ec_none_e) -- 2.34.1