libbb: introduce kernel-style BUILD_BUG_ON()
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 13 Oct 2015 12:50:20 +0000 (14:50 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 13 Oct 2015 12:50:20 +0000 (14:50 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/libbb.h
libbb/procps.c
networking/ftpgetput.c
networking/isrv.c
networking/ping.c
networking/tc.c
networking/tftp.c
runit/runsv.c
util-linux/umount.c

index a8ceb449c6cb11c3793dc1d69e5ee5c807429c0b..5a270cdca8d408bf9f21ce4fe39256e1f0514698 100644 (file)
@@ -1901,6 +1901,7 @@ extern const char bb_default_login_shell[] ALIGN1;
 
 
 #define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0])))
+#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
 
 
 /* We redefine ctype macros. Unicode-correct handling of char types
index 71ad071e6692fe4ba71eaa3b1e19f42e2ff698c6..05eefe0da9d3118a46451e5ba8b6ede705c42798 100644 (file)
@@ -283,7 +283,6 @@ int FAST_FUNC procps_read_smaps(pid_t pid, struct smaprec *total,
 }
 #endif
 
-void BUG_comm_size(void);
 procps_status_t* FAST_FUNC procps_scan(procps_status_t* sp, int flags)
 {
        if (!sp)
@@ -385,8 +384,7 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t* sp, int flags)
                        /*if (!cp || cp[1] != ' ')
                                continue;*/
                        cp[0] = '\0';
-                       if (sizeof(sp->comm) < 16)
-                               BUG_comm_size();
+                       BUILD_BUG_ON(sizeof(sp->comm) < 16);
                        comm1 = strchr(buf, '(');
                        /*if (comm1)*/
                                safe_strncpy(sp->comm, comm1 + 1, sizeof(sp->comm));
index 8283366ccc7595e3c8bf8c309315de917858fab6..b398bc8742f79f534ef219052994571bf5390e30 100644 (file)
@@ -62,9 +62,6 @@ struct globals {
 } FIX_ALIASING;
 #define G (*(struct globals*)&bb_common_bufsiz1)
 enum { BUFSZ = COMMON_BUFSIZE - offsetof(struct globals, buf) };
-struct BUG_G_too_big {
-       char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
-};
 #define user           (G.user          )
 #define password       (G.password      )
 #define lsa            (G.lsa           )
@@ -72,7 +69,9 @@ struct BUG_G_too_big {
 #define verbose_flag   (G.verbose_flag  )
 #define do_continue    (G.do_continue   )
 #define buf            (G.buf           )
-#define INIT_G() do { } while (0)
+#define INIT_G() do { \
+       BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
+} while (0)
 
 
 static void ftp_die(const char *msg) NORETURN;
index 1c6491eddad624fbc5d0e706f55287a5353218e8..3673db715e45b58a8f78f7f0192fa33fff61f2f7 100644 (file)
@@ -194,7 +194,6 @@ static void handle_accept(isrv_state_t *state, int fd)
                remove_peer(state, n); /* unsuccesful peer start */
 }
 
-void BUG_sizeof_fd_set_is_strange(void);
 static void handle_fd_set(isrv_state_t *state, fd_set *fds, int (*h)(int, void **))
 {
        enum { LONG_CNT = sizeof(fd_set) / sizeof(long) };
@@ -203,8 +202,7 @@ static void handle_fd_set(isrv_state_t *state, fd_set *fds, int (*h)(int, void *
        /* need to know value at _the beginning_ of this routine */
        int fd_cnt = FD_COUNT;
 
-       if (LONG_CNT * sizeof(long) != sizeof(fd_set))
-               BUG_sizeof_fd_set_is_strange();
+       BUILD_BUG_ON(LONG_CNT * sizeof(long) != sizeof(fd_set));
 
        fds_pos = 0;
        while (1) {
index dcbf196821d9df1214fff8d90ae5cb5dc3e5fe62..0eb1ae79956c99c67c394eab500784e54239ebf9 100644 (file)
@@ -396,10 +396,8 @@ struct globals {
 #define dotted       (G.dotted      )
 #define pingaddr     (G.pingaddr    )
 #define rcvd_tbl     (G.rcvd_tbl    )
-void BUG_ping_globals_too_big(void);
 #define INIT_G() do { \
-       if (sizeof(G) > COMMON_BUFSIZE) \
-               BUG_ping_globals_too_big(); \
+       BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
        datalen = DEFDATALEN; \
        timeout = MAXWAIT; \
        tmin = UINT_MAX; \
@@ -732,7 +730,6 @@ static void ping4(len_and_sockaddr *lsa)
        }
 }
 #if ENABLE_PING6
-extern int BUG_bad_offsetof_icmp6_cksum(void);
 static void ping6(len_and_sockaddr *lsa)
 {
        int sockopt;
@@ -769,8 +766,7 @@ static void ping6(len_and_sockaddr *lsa)
        setsockopt_SOL_SOCKET_int(pingsock, SO_RCVBUF, sockopt);
 
        sockopt = offsetof(struct icmp6_hdr, icmp6_cksum);
-       if (offsetof(struct icmp6_hdr, icmp6_cksum) != 2)
-               BUG_bad_offsetof_icmp6_cksum();
+       BUILD_BUG_ON(offsetof(struct icmp6_hdr, icmp6_cksum) != 2);
        setsockopt_int(pingsock, SOL_RAW, IPV6_CHECKSUM, sockopt);
 
        /* request ttl info to be returned in ancillary data */
index 76e2e83599bfd2a2576e446e7950ccdeac9de4a1..6d1fef9931fc48ec527357157db3359263e327d4 100644 (file)
@@ -64,15 +64,14 @@ struct globals {
        uint32_t filter_proto;
 } FIX_ALIASING;
 #define G (*(struct globals*)&bb_common_bufsiz1)
-struct BUG_G_too_big {
-       char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
-};
 #define filter_ifindex (G.filter_ifindex)
 #define filter_qdisc (G.filter_qdisc)
 #define filter_parent (G.filter_parent)
 #define filter_prio (G.filter_prio)
 #define filter_proto (G.filter_proto)
-#define INIT_G() do { } while (0)
+#define INIT_G() do { \
+       BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
+} while (0)
 
 /* Allocates a buffer containing the name of a class id.
  * The caller must free the returned memory.  */
index 8ecd7bb6fff3f7be660736edd09483996e095d9f..ad9308e524cf0c2fea93ee14b03be47300109d06 100644 (file)
@@ -129,10 +129,9 @@ struct globals {
 #endif
 } FIX_ALIASING;
 #define G (*(struct globals*)&bb_common_bufsiz1)
-struct BUG_G_too_big {
-       char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
-};
-#define INIT_G() do { } while (0)
+#define INIT_G() do { \
+       BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
+} while (0)
 
 #define G_error_pkt_reason (G.error_pkt[3])
 #define G_error_pkt_str    ((char*)(G.error_pkt + 4))
index 94d286059431a7d393692cafa9b2803be8b6153c..6cf5bcc29ba573d188206c2125c92a4dbe94a4c9 100644 (file)
@@ -49,16 +49,11 @@ static void gettimeofday_ns(struct timespec *ts)
 #else
 static void gettimeofday_ns(struct timespec *ts)
 {
-       if (sizeof(struct timeval) == sizeof(struct timespec)
-        && sizeof(((struct timeval*)ts)->tv_usec) == sizeof(ts->tv_nsec)
-       ) {
-               /* Cheat */
-               gettimeofday((void*)ts, NULL);
-               ts->tv_nsec *= 1000;
-       } else {
-               extern void BUG_need_to_implement_gettimeofday_ns(void);
-               BUG_need_to_implement_gettimeofday_ns();
-       }
+       BUILD_BUG_ON(sizeof(struct timeval) != sizeof(struct timespec));
+       BUILD_BUG_ON(sizeof(((struct timeval*)ts)->tv_usec) != sizeof(ts->tv_nsec));
+       /* Cheat */
+       gettimeofday((void*)ts, NULL);
+       ts->tv_nsec *= 1000;
 }
 #endif
 
index c6c7441b86706060ccdcf4022fb21485ddb69d80..00910977d5c91035ab7af91c98128ce923ab7827 100644 (file)
@@ -82,11 +82,7 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
 
        // MNT_FORCE and MNT_DETACH (from linux/fs.h) must match
        // OPT_FORCE and OPT_LAZY.
-       {
-               typedef char bug[
-                       (OPT_FORCE != MNT_FORCE || OPT_LAZY != MNT_DETACH) ? -1 : 1
-               ];
-       }
+       BUILD_BUG_ON(OPT_FORCE != MNT_FORCE || OPT_LAZY != MNT_DETACH);
        doForce = opt & (OPT_FORCE|OPT_LAZY);
 
        /* Get a list of mount points from mtab.  We read them all in now mostly