From 98fd1f9c47fc442f179c0f104865b352583780ca Mon Sep 17 00:00:00 2001 From: Jesse Ruderman Date: Sun, 11 Jul 2021 07:45:55 -0700 Subject: [PATCH] Use offsetof to reduce UB --- Makefile | 1 + locations.cpp | 5 ++--- mymake.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index d74aade6..59744a49 100644 --- a/Makefile +++ b/Makefile @@ -84,6 +84,7 @@ ifeq (${TOOLCHAIN},clang) CXXFLAGS_EARLY += -march=native -fPIC CXXFLAGS_EARLY += -W -Wall -Wextra -Werror -pedantic CXXFLAGS_EARLY += -Wno-unused-parameter -Wno-implicit-fallthrough -Wno-maybe-uninitialized -Wno-unknown-warning-option + CXXFLAGS_EARLY += -Wno-invalid-offsetof endif ifeq (${TOOLCHAIN},gcc) diff --git a/locations.cpp b/locations.cpp index e4f564a3..904110fd 100644 --- a/locations.cpp +++ b/locations.cpp @@ -134,7 +134,7 @@ template struct connection_table { unsigned char *spintable() { return (unsigned char*) (&move_table[full()->degree()]); } /** \brief get the full T from the pointer to this connection table */ - T* full() { T* x = (T*) this; return (T*)((char*)this - ((char*)(&(x->c)) - (char*)x)); } + T* full() { return (T*)((char*)this - offsetof(T, c)); } /** \brief for the edge d, set the `spin` and `mirror` attributes */ void setspin(int d, int spin, bool mirror) { unsigned char& c = spintable() [d]; @@ -178,10 +178,9 @@ template struct connection_table { */ template T* tailored_alloc(int degree) { - const T* sample = nullptr; T* result; #ifndef NO_TAILORED_ALLOC - int b = (char*)&sample->c.move_table[degree] + degree - (char*) sample; + int b = offsetof(T, c) + offsetof(connection_table, move_table) + sizeof(T*) * degree + degree; result = (T*) new char[b]; new (result) T(); #else diff --git a/mymake.cpp b/mymake.cpp index 9d089e62..f29bb853 100644 --- a/mymake.cpp +++ b/mymake.cpp @@ -75,7 +75,7 @@ void set_linux() { void set_mac() { preprocessor = "g++ -E"; - compiler = "g++ -march=native -W -Wall -Wextra -pedantic -Wno-unused-parameter -Wno-implicit-fallthrough -c"; + compiler = "g++ -march=native -W -Wall -Wextra -pedantic -Wno-unused-parameter -Wno-implicit-fallthrough -Wno-invalid-offsetof -c"; linker = "g++ -o hyper"; opts = "-DMAC -I/usr/local/include"; libs = " -L/usr/local/lib -framework AppKit -framework OpenGL -lSDL -lSDLMain -lSDL_gfx -lSDL_mixer -lSDL_ttf -lpng -lpthread -lz";