From b375c53c7d0a4232b85bb8dbad3dfed28a6f7278 Mon Sep 17 00:00:00 2001 From: leitner Date: Fri, 29 Sep 2023 17:28:11 +0000 Subject: [PATCH] get rid of undefined behavior regarding order of evaluation --- buffer/prs_u16.c | 3 ++- buffer/prs_u16_big.c | 3 ++- buffer/prs_u32.c | 5 ++++- buffer/prs_u32_big.c | 5 ++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/buffer/prs_u16.c b/buffer/prs_u16.c index 4e17e9d..1e2b819 100644 --- a/buffer/prs_u16.c +++ b/buffer/prs_u16.c @@ -1,7 +1,8 @@ #include "parse.h" uint16_t prs_u16(struct bytestream* bs) { - return bs_get(bs) | (bs_get(bs) << 8); + unsigned char c = bs_get(bs); + return c | (bs_get(bs) << 8); } #ifdef UNITTEST diff --git a/buffer/prs_u16_big.c b/buffer/prs_u16_big.c index e02ead2..8ef66ec 100644 --- a/buffer/prs_u16_big.c +++ b/buffer/prs_u16_big.c @@ -1,7 +1,8 @@ #include "parse.h" uint16_t prs_u16_big(struct bytestream* bs) { - return (bs_get(bs) << 8) | bs_get(bs); + uint16_t x = bs_get(bs) << 8; + return x | bs_get(bs); } #ifdef UNITTEST diff --git a/buffer/prs_u32.c b/buffer/prs_u32.c index 555bb14..f687de5 100644 --- a/buffer/prs_u32.c +++ b/buffer/prs_u32.c @@ -1,7 +1,10 @@ #include "parse.h" uint32_t prs_u32(struct bytestream* bs) { - return bs_get(bs) | (bs_get(bs) << 8) | (bs_get(bs) << 16) | (bs_get(bs) << 24); + uint32_t x = bs_get(bs); + x |= bs_get(bs) << 8; + x |= bs_get(bs) << 16; + return x | (bs_get(bs) << 24); } #ifdef UNITTEST diff --git a/buffer/prs_u32_big.c b/buffer/prs_u32_big.c index 900071e..237e96b 100644 --- a/buffer/prs_u32_big.c +++ b/buffer/prs_u32_big.c @@ -1,7 +1,10 @@ #include "parse.h" uint32_t prs_u32_big(struct bytestream* bs) { - return (bs_get(bs) << 24) | (bs_get(bs) << 16) | (bs_get(bs) << 8) | bs_get(bs); + uint32_t x = bs_get(bs) << 24; + x |= bs_get(bs) << 16; + x |= bs_get(bs) << 8; + return x | bs_get(bs); } #ifdef UNITTEST