Skip to content

Commit 5795655

Browse files
committed
Use unions to perform safe type-punning.
Signed-off-by: Drew Fisher <[email protected]>
1 parent 713c715 commit 5795655

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

src/cameras.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -910,15 +910,25 @@ static int freenect_fetch_zero_plane_info(freenect_device *dev)
910910
}
911911

912912
memcpy(&(dev->registration.zero_plane_info), reply + 94, sizeof(dev->registration.zero_plane_info));
913-
uint32_t temp;
914-
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_emitter_dist)));
915-
dev->registration.zero_plane_info.dcmos_emitter_dist = *((float*)(&temp));
916-
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_rcmos_dist)));
917-
dev->registration.zero_plane_info.dcmos_rcmos_dist = *((float*)(&temp));
918-
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_distance)));
919-
dev->registration.zero_plane_info.reference_distance = *((float*)(&temp));
920-
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_pixel_size)));
921-
dev->registration.zero_plane_info.reference_pixel_size = *((float*)(&temp));
913+
union {
914+
uint32_t ui;
915+
float f;
916+
} conversion_union;
917+
conversion_union.f = dev->registration.zero_plane_info.dcmos_emitter_dist;
918+
conversion_union.ui = fn_le32(conversion_union.ui);
919+
dev->registration.zero_plane_info.dcmos_emitter_dist = conversion_union.f;
920+
921+
conversion_union.f = dev->registration.zero_plane_info.dcmos_rcmos_dist;
922+
conversion_union.ui = fn_le32(conversion_union.ui);
923+
dev->registration.zero_plane_info.dcmos_rcmos_dist = conversion_union.f;
924+
925+
conversion_union.f = dev->registration.zero_plane_info.reference_distance;
926+
conversion_union.ui = fn_le32(conversion_union.ui);
927+
dev->registration.zero_plane_info.reference_distance = conversion_union.f;
928+
929+
conversion_union.f = dev->registration.zero_plane_info.reference_pixel_size;
930+
conversion_union.ui = fn_le32(conversion_union.ui);
931+
dev->registration.zero_plane_info.reference_pixel_size = conversion_union.f;
922932

923933
// WTF is all this data? it's way bigger than sizeof(XnFixedParams)...
924934
FN_SPEW("dcmos_emitter_distance: %f\n", dev->registration.zero_plane_info.dcmos_emitter_dist);

src/freenect_internal.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,24 @@ static inline uint32_t fn_le32(uint32_t d)
9696
static inline int16_t fn_le16s(int16_t s)
9797
{
9898
// reinterpret cast to unsigned, use the normal fn_le16, and then reinterpret cast back
99-
uint16_t temp = (*(uint16_t*)(&s));
100-
temp = fn_le16(temp);
101-
return *((int16_t*)(&temp));
99+
union {
100+
int16_t s;
101+
uint16_t u;
102+
} conversion_union;
103+
conversion_union.s = s;
104+
conversion_union.u = fn_le16(conversion_union.u);
105+
return conversion_union.s;
102106
}
103107
static inline int32_t fn_le32s(int32_t s)
104108
{
105109
// reinterpret cast to unsigned, use the normal fn_le32, and then reinterpret cast back
106-
uint32_t temp = (*(uint32_t*)(&s));
107-
temp = fn_le32(temp);
108-
return *((int32_t*)(&temp));
110+
union {
111+
int32_t s;
112+
uint32_t u;
113+
} conversion_union;
114+
conversion_union.s = s;
115+
conversion_union.u = fn_le32(conversion_union.u);
116+
return conversion_union.s;
109117
}
110118
#else
111119
#define fn_le16(x) (x)

0 commit comments

Comments
 (0)