diff options
author | Marti Maria <marti.maria@littlecms.com> | 2022-07-06 11:55:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-06 11:55:34 +0200 |
commit | 5798448a464817ac17abc0dbd7cc5017d088f01d (patch) | |
tree | 835c8b80c9e3b6f47fe462bc7d029378464bef46 /src/cmsplugin.c | |
parent | c3b325ef21700bf244782566c70eae4b1345365c (diff) | |
parent | d98de0bb0b627772625c1acf050ba0dd4b5ac9df (diff) | |
download | lcms2-5798448a464817ac17abc0dbd7cc5017d088f01d.tar.gz |
Merge pull request #324 from SoapGentoo/type-punning-union
Perform type punning via union without undefined behavior
Looks great, thank you!
Diffstat (limited to 'src/cmsplugin.c')
-rw-r--r-- | src/cmsplugin.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/src/cmsplugin.c b/src/cmsplugin.c index 142c86d..7d038d2 100644 --- a/src/cmsplugin.c +++ b/src/cmsplugin.c @@ -168,22 +168,21 @@ cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n) cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n) { - cmsUInt32Number tmp; + union typeConverter { + cmsUInt32Number integer; + cmsFloat32Number floating_point; + } tmp; _cmsAssert(io != NULL); - if (io->Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) + if (io->Read(io, &tmp.integer, sizeof(cmsUInt32Number), 1) != 1) return FALSE; if (n != NULL) { - const cmsFloat32Number* f; // gcc complaing on strict aliasing if this pointer is not used. - - tmp = _cmsAdjustEndianess32(tmp); + tmp.integer = _cmsAdjustEndianess32(tmp.integer); + *n = tmp.floating_point; - f = (const cmsFloat32Number*) &tmp; - *n = *f; - // Safeguard which covers against absurd values if (*n > 1E+20 || *n < -1E+20) return FALSE; @@ -309,14 +308,14 @@ cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n) cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n) { - cmsUInt32Number tmp; - const cmsFloat32Number* f = &n; - - _cmsAssert(io != NULL); - - tmp = *(cmsUInt32Number*)f; - tmp = _cmsAdjustEndianess32(tmp); - if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) + union typeConverter { + cmsUInt32Number integer; + cmsFloat32Number floating_point; + } tmp; + + tmp.floating_point = n; + tmp.integer = _cmsAdjustEndianess32(tmp.integer); + if (io -> Write(io, sizeof(cmsUInt32Number), &tmp.integer) != 1) return FALSE; return TRUE; |