summaryrefslogtreecommitdiff
path: root/src/cmsplugin.c
diff options
context:
space:
mode:
authorMarti Maria <marti.maria@littlecms.com>2022-07-06 11:55:34 +0200
committerGitHub <noreply@github.com>2022-07-06 11:55:34 +0200
commit5798448a464817ac17abc0dbd7cc5017d088f01d (patch)
tree835c8b80c9e3b6f47fe462bc7d029378464bef46 /src/cmsplugin.c
parentc3b325ef21700bf244782566c70eae4b1345365c (diff)
parentd98de0bb0b627772625c1acf050ba0dd4b5ac9df (diff)
downloadlcms2-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.c31
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;