]> Kevux Git Server - fll/commitdiff
Update: Explicitly cast UTF conversion to/from and simple packet bit operations to...
authorKevin Day <thekevinday@gmail.com>
Sun, 31 Dec 2023 02:33:20 +0000 (20:33 -0600)
committerKevin Day <thekevinday@gmail.com>
Sun, 31 Dec 2023 02:34:47 +0000 (20:34 -0600)
If the type is changed or the defines are used with different types, then the shift operators may become problematic.
Prevent this potential problem from happening through explicit casts to uint32_t.

level_0/f_fss/c/fss/simple_packet.c
level_0/f_utf/c/utf/common.h

index 0c321e0f32ff770654f7c1a120224ac8c6e25646..5a2c70b17bb9c949f493b58d6689639b1e59001b 100644 (file)
@@ -17,32 +17,32 @@ extern "C" {
     #ifdef _is_F_endian_little
       // Big Endian.
       if (packet->control & F_fss_simple_packet_endian_d) {
-        packet->size = ((uint8_t) buffer.string[1]);
-        packet->size += ((uint8_t) buffer.string[2]) << 8;
-        packet->size += ((uint8_t) buffer.string[3]) << 16;
-        packet->size += ((uint8_t) buffer.string[4]) << 24;
+        packet->size = (uint32_t) ((uint8_t) buffer.string[1]);
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4])) << 24;
       }
       // Little Endian.
       else {
-        packet->size = ((uint8_t) buffer.string[1]) << 24;
-        packet->size += ((uint8_t) buffer.string[2]) << 16;
-        packet->size += ((uint8_t) buffer.string[3]) << 8;
-        packet->size += ((uint8_t) buffer.string[4]);
+        packet->size = ((uint32_t) ((uint8_t) buffer.string[1])) << 24;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4]));
       }
     #else
       // Big Endian.
       if (packet->control & F_fss_simple_packet_endian_d) {
-        packet->size = ((uint8_t) buffer.string[1]) << 24;
-        packet->size += ((uint8_t) buffer.string[2]) << 16;
-        packet->size += ((uint8_t) buffer.string[3]) << 8;
-        packet->size += ((uint8_t) buffer.string[4]);
+        packet->size = ((uint32_t) ((uint8_t) buffer.string[1])) << 24;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4]));
       }
       // Little Endian.
       else {
-        packet->size = ((uint8_t) buffer.string[1]);
-        packet->size += ((uint8_t) buffer.string[2]) << 8;
-        packet->size += ((uint8_t) buffer.string[3]) << 16;
-        packet->size += ((uint8_t) buffer.string[4]) << 24;
+        packet->size = ((uint32_t) ((uint8_t) buffer.string[1]));
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4])) << 24;
       }
     #endif // _is_F_endian_little
 
@@ -63,32 +63,32 @@ extern "C" {
     #ifdef _is_F_endian_little
       // Big Endian.
       if (packet->control & F_fss_simple_packet_endian_d) {
-        packet->size = ((uint8_t) buffer.string[1]);
-        packet->size += ((uint8_t) buffer.string[2]) << 8;
-        packet->size += ((uint8_t) buffer.string[3]) << 16;
-        packet->size += ((uint8_t) buffer.string[4]) << 24;
+        packet->size = ((uint32_t) ((uint8_t) buffer.string[1]));
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4])) << 24;
       }
       // Little Endian.
       else {
-        packet->size = ((uint8_t) buffer.string[1]) << 24;
-        packet->size += ((uint8_t) buffer.string[2]) << 16;
-        packet->size += ((uint8_t) buffer.string[3]) << 8;
-        packet->size += ((uint8_t) buffer.string[4]);
+        packet->size = ((uint32_t) ((uint8_t) buffer.string[1])) << 24;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4]));
       }
     #else
       // Big Endian.
       if (packet->control & F_fss_simple_packet_endian_d) {
-        packet->size = ((uint8_t) buffer.string[1]) << 24;
-        packet->size += ((uint8_t) buffer.string[2]) << 16;
-        packet->size += ((uint8_t) buffer.string[3]) << 8;
-        packet->size += ((uint8_t) buffer.string[4]);
+        packet->size = ((uint32_t) ((uint8_t) buffer.string[1])) << 24;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4]));
       }
       // Little Endian.
       else {
-        packet->size = ((uint8_t) buffer.string[1]);
-        packet->size += ((uint8_t) buffer.string[2]) << 8;
-        packet->size += ((uint8_t) buffer.string[3]) << 16;
-        packet->size += ((uint8_t) buffer.string[4]) << 24;
+        packet->size = ((uint32_t) ((uint8_t) buffer.string[1]));
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[2])) << 8;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[3])) << 16;
+        packet->size += ((uint32_t) ((uint8_t) buffer.string[4])) << 24;
       }
     #endif // _is_F_endian_little
 
index 3cf696b02db7cc0fa611f6cdfcae0e992293c7fd..5f65f6f6e94d39a21007eaea8467e395dd56350c 100644 (file)
@@ -261,15 +261,15 @@ extern "C" {
   #define F_utf_char_mask_char_3_be_d 0x0000ff00 // 0000 0000, 0000 0000, 1111 1111, 0000 0000
   #define F_utf_char_mask_char_4_be_d 0x000000ff // 0000 0000, 0000 0000, 0000 0000, 1111 1111
 
-  #define macro_f_utf_char_t_to_char_1_be(sequence) (((sequence) & F_utf_char_mask_char_1_be_d) >> 24) // Grab first byte.
-  #define macro_f_utf_char_t_to_char_2_be(sequence) (((sequence) & F_utf_char_mask_char_2_be_d) >> 16) // Grab second byte.
-  #define macro_f_utf_char_t_to_char_3_be(sequence) (((sequence) & F_utf_char_mask_char_3_be_d) >> 8)  // Grab third byte.
-  #define macro_f_utf_char_t_to_char_4_be(sequence) ((sequence) & F_utf_char_mask_char_4_be_d)         // Grab fourth byte.
+  #define macro_f_utf_char_t_to_char_1_be(sequence) ((uint32_t) ((sequence) & F_utf_char_mask_char_1_be_d) >> 24) // Grab first byte.
+  #define macro_f_utf_char_t_to_char_2_be(sequence) ((uint32_t) ((sequence) & F_utf_char_mask_char_2_be_d) >> 16) // Grab second byte.
+  #define macro_f_utf_char_t_to_char_3_be(sequence) ((uint32_t) ((sequence) & F_utf_char_mask_char_3_be_d) >> 8)  // Grab third byte.
+  #define macro_f_utf_char_t_to_char_4_be(sequence) ((uint32_t) (sequence) & F_utf_char_mask_char_4_be_d)         // Grab fourth byte.
 
-  #define macro_f_utf_char_t_from_char_1_be(sequence) (((sequence) << 24) & F_utf_char_mask_char_1_be_d) // Shift to first byte.
-  #define macro_f_utf_char_t_from_char_2_be(sequence) (((sequence) << 16) & F_utf_char_mask_char_2_be_d) // Shift to second byte.
-  #define macro_f_utf_char_t_from_char_3_be(sequence) (((sequence) << 8) & F_utf_char_mask_char_3_be_d)  // Shift to third byte.
-  #define macro_f_utf_char_t_from_char_4_be(sequence) ((sequence) & F_utf_char_mask_char_4_be_d)         // Shift to fourth byte.
+  #define macro_f_utf_char_t_from_char_1_be(sequence) ((((uint32_t) (sequence)) << 24) & F_utf_char_mask_char_1_be_d) // Shift to first byte.
+  #define macro_f_utf_char_t_from_char_2_be(sequence) ((((uint32_t) (sequence)) << 16) & F_utf_char_mask_char_2_be_d) // Shift to second byte.
+  #define macro_f_utf_char_t_from_char_3_be(sequence) ((((uint32_t) (sequence)) << 8) & F_utf_char_mask_char_3_be_d)  // Shift to third byte.
+  #define macro_f_utf_char_t_from_char_4_be(sequence) (((uint32_t) (sequence)) & F_utf_char_mask_char_4_be_d)         // Shift to fourth byte.
 
   // Little Endian.
   #define F_utf_char_mask_byte_1_le_d 0x000000ff // 0000 0000, 0000 0000, 0000 0000, 1111 1111
@@ -282,15 +282,15 @@ extern "C" {
   #define F_utf_char_mask_char_3_le_d 0x00ff0000 // 0000 0000, 1111 1111, 0000 0000, 0000 0000
   #define F_utf_char_mask_char_4_le_d 0xff000000 // 1111 1111, 0000 0000, 0000 0000, 0000 0000
 
-  #define macro_f_utf_char_t_to_char_1_le(sequence) ((sequence) & F_utf_char_mask_char_1_le_d)         // Grab first byte.
-  #define macro_f_utf_char_t_to_char_2_le(sequence) (((sequence) & F_utf_char_mask_char_2_le_d) >> 8)  // Grab second byte.
-  #define macro_f_utf_char_t_to_char_3_le(sequence) (((sequence) & F_utf_char_mask_char_3_le_d) >> 16) // Grab third byte.
-  #define macro_f_utf_char_t_to_char_4_le(sequence) (((sequence) & F_utf_char_mask_char_4_le_d) >> 24) // Grab fourth byte.
+  #define macro_f_utf_char_t_to_char_1_le(sequence) ((uint32_t) ((sequence) & F_utf_char_mask_char_1_le_d))         // Grab first byte.
+  #define macro_f_utf_char_t_to_char_2_le(sequence) (((uint32_t) ((sequence) & F_utf_char_mask_char_2_le_d)) >> 8)  // Grab second byte.
+  #define macro_f_utf_char_t_to_char_3_le(sequence) (((uint32_t) ((sequence) & F_utf_char_mask_char_3_le_d)) >> 16) // Grab third byte.
+  #define macro_f_utf_char_t_to_char_4_le(sequence) (((uint32_t) ((sequence) & F_utf_char_mask_char_4_le_d)) >> 24) // Grab fourth byte.
 
-  #define macro_f_utf_char_t_from_char_1_le(sequence) ((sequence) & F_utf_char_mask_char_1_le_d)         // Shift to first byte.
-  #define macro_f_utf_char_t_from_char_2_le(sequence) (((sequence) << 8) & F_utf_char_mask_char_2_le_d)  // Shift to second byte.
-  #define macro_f_utf_char_t_from_char_3_le(sequence) (((sequence) << 16) & F_utf_char_mask_char_3_le_d) // Shift to third byte.
-  #define macro_f_utf_char_t_from_char_4_le(sequence) (((sequence) << 24) & F_utf_char_mask_char_4_le_d) // Shift to fourth byte.
+  #define macro_f_utf_char_t_from_char_1_le(sequence) (((uint32_t) (sequence) & F_utf_char_mask_char_1_le_d))         // Shift to first byte.
+  #define macro_f_utf_char_t_from_char_2_le(sequence) ((((uint32_t) (sequence) << 8) & F_utf_char_mask_char_2_le_d))  // Shift to second byte.
+  #define macro_f_utf_char_t_from_char_3_le(sequence) ((((uint32_t) (sequence) << 16) & F_utf_char_mask_char_3_le_d)) // Shift to third byte.
+  #define macro_f_utf_char_t_from_char_4_le(sequence) ((((uint32_t) (sequence) << 24) & F_utf_char_mask_char_4_le_d)) // Shift to fourth byte.
 
   #define F_utf_char_mask_byte_1_d F_utf_char_mask_byte_1_be_d
   #define F_utf_char_mask_byte_2_d F_utf_char_mask_byte_2_be_d