Add check for __Static_assert() and asserts on struct sizes
authorKirill Isakov <bootctl@gmail.com>
Mon, 28 Mar 2022 07:09:07 +0000 (13:09 +0600)
committerKirill Isakov <bootctl@gmail.com>
Mon, 28 Mar 2022 15:38:29 +0000 (21:38 +0600)
src/ethernet.h
src/have.h
src/ipv4.h
src/ipv6.h
src/meson.build

index 4ef9dab..ddb0a7c 100644 (file)
@@ -68,6 +68,8 @@ struct ether_header {
 };
 #endif
 
+STATIC_ASSERT(sizeof(struct ether_header) == 14, "ether_header has incorrect size");
+
 #ifndef HAVE_STRUCT_ARPHDR
 struct arphdr {
        uint16_t ar_hrd;
@@ -86,6 +88,8 @@ struct arphdr {
 #define ARPOP_NAK 10
 #endif
 
+STATIC_ASSERT(sizeof(struct arphdr) == 8, "arphdr has incorrect size");
+
 #ifndef HAVE_STRUCT_ETHER_ARP
 struct  ether_arp {
        struct  arphdr ea_hdr;
@@ -101,4 +105,6 @@ struct  ether_arp {
 #define arp_op ea_hdr.ar_op
 #endif
 
+STATIC_ASSERT(sizeof(struct ether_arp) == 28, "ether_arp has incorrect size");
+
 #endif
index 36d17b6..2428151 100644 (file)
 #include <math.h>
 #include <time.h>
 
+#ifdef HAVE_STATIC_ASSERT
+#define STATIC_ASSERT(expr, msg) _Static_assert((expr), msg)
+#else
+#define STATIC_ASSERT(check, msg)
+#endif
+
 #ifdef HAVE_ALLOCA_H
 #include <alloca.h>
 #elif defined(HAVE_NETBSD)
index a412c60..004f4e5 100644 (file)
@@ -86,6 +86,8 @@ struct ip {
 };
 #endif
 
+STATIC_ASSERT(sizeof(struct ip) == 20, "ip has incorrect size");
+
 #ifndef IP_OFFMASK
 #define IP_OFFMASK 0x1fff
 #endif
@@ -148,4 +150,6 @@ struct icmp {
 };
 #endif
 
+STATIC_ASSERT(sizeof(struct icmp) == 28, "icmp has incorrect size");
+
 #endif
index 7c06de3..6f1e221 100644 (file)
@@ -60,6 +60,8 @@ struct ip6_hdr {
 #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
 #endif
 
+STATIC_ASSERT(sizeof(struct ip6_hdr) == 40, "ip6_hdr has incorrect size");
+
 #ifndef HAVE_STRUCT_ICMP6_HDR
 struct icmp6_hdr {
        uint8_t icmp6_type;
@@ -86,6 +88,8 @@ struct icmp6_hdr {
 #define icmp6_mtu icmp6_data32[0]
 #endif
 
+STATIC_ASSERT(sizeof(struct icmp6_hdr) == 8, "icmp6_hdr has incorrect size");
+
 #ifndef HAVE_STRUCT_ND_NEIGHBOR_SOLICIT
 struct nd_neighbor_solicit {
        struct icmp6_hdr nd_ns_hdr;
@@ -99,6 +103,8 @@ struct nd_neighbor_solicit {
 #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
 #endif
 
+STATIC_ASSERT(sizeof(struct nd_neighbor_solicit) == 24, "nd_neighbor_solicit has incorrect size");
+
 #ifndef HAVE_STRUCT_ND_OPT_HDR
 struct nd_opt_hdr {
        uint8_t nd_opt_type;
@@ -106,4 +112,6 @@ struct nd_opt_hdr {
 };
 #endif
 
+STATIC_ASSERT(sizeof(struct nd_opt_hdr) == 2, "nd_opt_hdr has incorrect size");
+
 #endif
index e37c2db..b1796af 100644 (file)
@@ -15,6 +15,14 @@ foreach attr : ['malloc', 'nonnull', 'warn_unused_result']
   cc.has_function_attribute(attr)
 endforeach
 
+if cc.compiles('''
+    _Static_assert(1, "ok");
+    int main(void) { return 0; }
+''')
+  cdata.set('HAVE_STATIC_ASSERT', 1,
+            description: 'C11 _Static_assert()')
+endif
+
 check_headers = [
   'alloca.h',
   'arpa/inet.h',