diff --git a/tests/lwip_sock_ip/stack.c b/tests/lwip_sock_ip/stack.c
index 0cbe29ec44dc8c8b126ae72e808eaa451e936123..4a011e59ed20b6078249f803e1ab67dd3055de1b 100644
--- a/tests/lwip_sock_ip/stack.c
+++ b/tests/lwip_sock_ip/stack.c
@@ -197,9 +197,16 @@ void _net_init(void)
     netif_add(&netif, &netdev, lwip_netdev_init, tcpip_input);
 #endif
 #if LWIP_IPV6
-    static const uint8_t local6[] = _TEST_ADDR6_LOCAL;
+    static const uint8_t local6_a[] = _TEST_ADDR6_LOCAL;
+    /* XXX need to copy into a stack variable. Otherwise, when just using
+     * `local6_a` this leads to weird alignment problems on some platforms with
+     * netif_add_ip6_address() below */
+    ip6_addr_t local6;
     s8_t idx;
-    netif_add_ip6_address(&netif, (ip6_addr_t *)&local6, &idx);
+
+    memcpy(&local6.addr, local6_a, sizeof(local6));
+    ip6_addr_clear_zone(&local6);
+    netif_add_ip6_address(&netif, &local6, &idx);
     for (int i = 0; i <= idx; i++) {
         netif.ip6_addr_state[i] |= IP6_ADDR_VALID;
     }
diff --git a/tests/lwip_sock_udp/stack.c b/tests/lwip_sock_udp/stack.c
index 1440e08734be2d00d2df1ae99ea26b1c0c9bd25a..85271e1c58eef370897a77be2ea04906bfb0154a 100644
--- a/tests/lwip_sock_udp/stack.c
+++ b/tests/lwip_sock_udp/stack.c
@@ -199,9 +199,16 @@ void _net_init(void)
     netif_add(&netif, &netdev, lwip_netdev_init, tcpip_input);
 #endif
 #if LWIP_IPV6
-    static const uint8_t local6[] = _TEST_ADDR6_LOCAL;
+    static const uint8_t local6_a[] = _TEST_ADDR6_LOCAL;
+    /* XXX need to copy into a stack variable. Otherwise, when just using
+     * `local6_a` this leads to weird alignment problems on some platforms with
+     * netif_add_ip6_address() below */
+    ip6_addr_t local6;
     s8_t idx;
-    netif_add_ip6_address(&netif, (ip6_addr_t *)&local6, &idx);
+
+    memcpy(&local6.addr, local6_a, sizeof(local6));
+    ip6_addr_clear_zone(&local6);
+    netif_add_ip6_address(&netif, &local6, &idx);
     for (int i = 0; i <= idx; i++) {
         netif.ip6_addr_state[i] |= IP6_ADDR_VALID;
     }