OCamlPro / gnucobol

A clone of the sourceforge GnuCOBOL compiler from COBOL to C.
https://get-superbol.com
GNU Lesser General Public License v3.0
22 stars 24 forks source link

For better portability, stop using the type `long` #159

Open ddeclerck opened 4 months ago

ddeclerck commented 4 months ago

A potential source of bugs - and one of the reasons the MSVC debug CIs hangs / displays a runtime checker popup - is the use of the long type , whose size differs in 64-bit mode on MSVC (4 bytes) vs "rest of the world" compilers (8 bytes). (nitpicker's corner: okay, there might be a few other exceptions)

As an example, the test FUNCTION RANDOM fails here (intrinsic.c:cob_intr_random) :

seed = get_seconds_past_midnight () * (long)COB_MODULE_PTR;

Indeed, a 64-bit pointer won't fit in a 32-bit long, and the MSVC runtime checker will complain.

Wherever the size matters, I'd suggest using the C99 fixed width integer types (u)int64_t - providing a custom definition when missing. Or, we could just use cob_u64_t / cob_s64_t. (nitpicker's corner bis: yeah, for a pointer the proper cast would be to (u)intptr_t, not (u)int64_t)

Thoughts ?

GitMensch commented 4 months ago

This is the wrong place for this "feature request" - please create that upstream.

Obviously:

C99 types are nice - and should be postponed to GC4 with a fallback possibly provided by gnulib.

For the specific sample: a cast / bitwise truncation to cob_u32_t would be fine as well.

ddeclerck commented 4 months ago

Indeed, I opened that on SF => https://sourceforge.net/p/gnucobol/feature-requests/476/.