From ab3964db4e75e34f6f9347406c5fd2bced04f2dd Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 13 Oct 2015 14:50:20 +0200 Subject: [PATCH] libbb: introduce kernel-style BUILD_BUG_ON() Signed-off-by: Denys Vlasenko --- include/libbb.h | 1 + libbb/procps.c | 4 +--- networking/ftpgetput.c | 7 +++---- networking/isrv.c | 4 +--- networking/ping.c | 8 ++------ networking/tc.c | 7 +++---- networking/tftp.c | 7 +++---- runit/runsv.c | 15 +++++---------- util-linux/umount.c | 6 +----- 9 files changed, 20 insertions(+), 39 deletions(-) diff --git a/include/libbb.h b/include/libbb.h index a8ceb449c..5a270cdca 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -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 diff --git a/libbb/procps.c b/libbb/procps.c index 71ad071e6..05eefe0da 100644 --- a/libbb/procps.c +++ b/libbb/procps.c @@ -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)); diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index 8283366cc..b398bc874 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c @@ -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; diff --git a/networking/isrv.c b/networking/isrv.c index 1c6491edd..3673db715 100644 --- a/networking/isrv.c +++ b/networking/isrv.c @@ -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) { diff --git a/networking/ping.c b/networking/ping.c index dcbf19682..0eb1ae799 100644 --- a/networking/ping.c +++ b/networking/ping.c @@ -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 */ diff --git a/networking/tc.c b/networking/tc.c index 76e2e8359..6d1fef993 100644 --- a/networking/tc.c +++ b/networking/tc.c @@ -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. */ diff --git a/networking/tftp.c b/networking/tftp.c index 8ecd7bb6f..ad9308e52 100644 --- a/networking/tftp.c +++ b/networking/tftp.c @@ -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)) diff --git a/runit/runsv.c b/runit/runsv.c index 94d286059..6cf5bcc29 100644 --- a/runit/runsv.c +++ b/runit/runsv.c @@ -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 diff --git a/util-linux/umount.c b/util-linux/umount.c index c6c7441b8..00910977d 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c @@ -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