From 58129c7ee43cc3c2b4450e557ac5a258fe1a381e Mon Sep 17 00:00:00 2001 From: Matthew Fernandez Date: Thu, 22 Jan 2026 14:57:46 +1100 Subject: [PATCH] fix dereference of unaligned pointers during parsing With these changes, parsing a GOAL file with Undefined Behavior Sanitizer enabled is possible. These are not all the unaligned pointer dereferences in this file, but just enough to parse a file. --- htsim/sim/lgs/Parser.hpp | 52 ++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/htsim/sim/lgs/Parser.hpp b/htsim/sim/lgs/Parser.hpp index 948fbc2..25fb1e7 100644 --- a/htsim/sim/lgs/Parser.hpp +++ b/htsim/sim/lgs/Parser.hpp @@ -460,12 +460,14 @@ class SerializedGraph { void add_root_nodes() { - uint32_t num_root_nodes = (uint32_t) *( (uint32_t*) (mapping_start + sizeof(uint32_t)) ); + uint32_t num_root_nodes; + memcpy(&num_root_nodes, mapping_start + sizeof(uint32_t), sizeof(num_root_nodes)); for (uint32_t cnt=0; cnt num_nodes) { fprintf(stderr, "[rank %i] got offset %i, have %i nodes\n", my_rank, offset, num_nodes); @@ -489,18 +492,22 @@ class SerializedGraph { DeserializedNode N; // printf("yyy 2\n"); - N.DependenciesCnt = (uint32_t) *( (uint32_t*) start_of_node); - N.Type = (char) *(start_of_node + sizeof(uint32_t)); // after depcnt - N.Peer = (uint32_t) *( (uint32_t*) (start_of_node + sizeof(uint32_t) + sizeof(char)) ); // after depcnt + type - N.Size = (uint64_t) *( (uint64_t*) (start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t))); - N.Tag = (uint32_t) *( (uint32_t*) (start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t) + sizeof(uint64_t))); - N.Proc = (uint8_t) *( (uint8_t*) (start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t) + sizeof(uint64_t) + sizeof(uint32_t))); - N.Nic = (uint8_t) *( (uint8_t*) (start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t) + sizeof(uint64_t) + sizeof(uint32_t) + sizeof(uint8_t))); + memcpy(&N.DependenciesCnt, start_of_node, sizeof(N.DependenciesCnt)); + memcpy(&N.Type, start_of_node + sizeof(uint32_t), sizeof(N.Type)); // after depcnt + memcpy(&N.Peer, start_of_node + sizeof(uint32_t) + sizeof(char), sizeof(N.Peer)); // after depcnt + type + memcpy(&N.Size, start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t), sizeof(N.Size)); + memcpy(&N.Tag, start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t) + sizeof(uint64_t), sizeof(N.Tag)); + memcpy(&N.Proc, start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t) + sizeof(uint64_t) + sizeof(uint32_t), sizeof(N.Proc)); + memcpy(&N.Nic, start_of_node + sizeof(uint32_t) + sizeof(char) + sizeof(uint32_t) + sizeof(uint64_t) + sizeof(uint32_t) + sizeof(uint8_t), sizeof(N.Nic)); N.offset = (uint32_t) offset; - uint32_t num_deps = (uint32_t) *( (uint32_t*) (start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t)*3 + sizeof(uint8_t)*2)); - uint32_t deps_startoffset_in_apdx = (uint32_t) *( (uint32_t*) (start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t)*4 + sizeof(uint8_t)*2)); - uint32_t num_startdeps = (uint32_t) *( (uint32_t*) (start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t)*5 + sizeof(uint8_t)*2)); - uint32_t startdeps_startoffset_in_apdx = (uint32_t) *( (uint32_t*) (start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t)*6 + sizeof(uint8_t)*2)); + uint32_t num_deps; + memcpy(&num_deps, start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t) * 3 + sizeof(uint8_t) * 2, sizeof(num_deps)); + uint32_t deps_startoffset_in_apdx; + memcpy(&deps_startoffset_in_apdx, start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t) * 4 + sizeof(uint8_t) * 2, sizeof(deps_startoffset_in_apdx)); + uint32_t num_startdeps; + memcpy(&num_startdeps, start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t) * 5 + sizeof(uint8_t) * 2, sizeof(num_startdeps)); + uint32_t startdeps_startoffset_in_apdx; + memcpy(&startdeps_startoffset_in_apdx, start_of_node + sizeof(char) + sizeof(uint64_t) + sizeof(uint32_t) * 6 + sizeof(uint8_t) * 2, sizeof(startdeps_startoffset_in_apdx)); // printf("yyy 3\n"); // printf("yyy 3 start of apdx = mapping start + %i\n", sizeof(uint32_t)*2 + sizeof(uint32_t)*num_root_nodes + SIZEOF_NODE_INFO*num_nodes); // printf("yyy 3 numrootnodes = %i, SIZEOFNODEINFO = %i, num_nodes = %i\n", num_root_nodes, SIZEOF_NODE_INFO, num_nodes); @@ -508,7 +515,8 @@ class SerializedGraph { for (uint32_t cnt=0; cnt