bc: in non-interactive config, let compiler know that error funcs do not return
function old new delta
bc_num_s 235 239 +4
bc_lex_next 92 91 -1
dc_parse_register 53 51 -2
dc_parse_parse 46 44 -2
bc_vm_run 624 622 -2
bc_program_assignStr 146 144 -2
bc_parse_else 135 133 -2
bc_parse_body 116 114 -2
bc_num_a 445 443 -2
bc_func_insert 97 95 -2
bc_program_pushVar 203 200 -3
bc_parse_text 133 130 -3
bc_error_bad_character 17 14 -3
bc_error 14 11 -3
bc_program_printStream 157 153 -4
bc_program_prep 91 87 -4
bc_program_copyToVar 311 307 -4
bc_num_ulong 95 90 -5
bc_num_p 445 440 -5
bc_program_print 711 704 -7
bc_parse_endBody 365 358 -7
bc_num_r 237 230 -7
bc_num_d 550 543 -7
dc_lex_token 682 674 -8
bc_program_pushArray 147 139 -8
bc_program_assign 485 475 -10
bc_program_read 333 322 -11
bc_lex_token 1278 1266 -12
bc_parse_stmt 1780 1767 -13
bc_program_modexp 723 707 -16
dc_parse_expr 762 744 -18
bc_program_execStr 496 478 -18
bc_program_call 347 329 -18
bc_vm_file 219 197 -22
bc_program_binOpPrep 311 289 -22
bc_parse_name 539 513 -26
bc_parse_parse 451 423 -28
bc_program_num 912 880 -32
bc_read_line 172 139 -33
bc_program_exec 4048 4010 -38
bc_parse_auto 313 275 -38
bc_parse_expr_empty_ok 2095 2036 -59
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/41 up/down: 4/-509) Total: -505 bytes
text data bss dec hex filename
983707 485 7296 991488 f2100 busybox_old
983202 485 7296 990983 f1f07 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 26ab94c..aa478e4 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -976,7 +976,20 @@
}
}
-static NOINLINE int bc_error_fmt(const char *fmt, ...)
+#if ENABLE_FEATURE_BC_SIGNALS
+# define ERRORFUNC /*nothing*/
+# define ERROR_RETURN(a) a
+#else
+# if ENABLE_FEATURE_CLEAN_UP
+# define ERRORFUNC /*nothing*/
+# define ERROR_RETURN(a) a
+# else
+# define ERRORFUNC NORETURN
+# define ERROR_RETURN(a) /*nothing*/
+# endif
+#endif
+
+static NOINLINE ERRORFUNC int bc_error_fmt(const char *fmt, ...)
{
va_list p;
@@ -986,7 +999,7 @@
if (!ENABLE_FEATURE_CLEAN_UP && !G_ttyin)
exit(1);
- return BC_STATUS_FAILURE;
+ ERROR_RETURN(return BC_STATUS_FAILURE;)
}
#if ENABLE_BC
@@ -1016,9 +1029,33 @@
// function must not have caller-cleaned parameters on stack.
// Unfortunately, vararg function API does exactly that on most arches.
// Thus, use these shims for the cases when we have no vararg PARAMS:
-static int bc_error(const char *msg)
+static ERRORFUNC int bc_error(const char *msg)
{
- return bc_error_fmt("%s", msg);
+ ERROR_RETURN(return) bc_error_fmt("%s", msg);
+}
+static ERRORFUNC int bc_error_bad_character(char c)
+{
+ ERROR_RETURN(return) bc_error_fmt("bad character '%c'", c);
+}
+static ERRORFUNC int bc_error_bad_expression(void)
+{
+ ERROR_RETURN(return) bc_error("bad expression");
+}
+static ERRORFUNC int bc_error_bad_token(void)
+{
+ ERROR_RETURN(return) bc_error("bad token");
+}
+static ERRORFUNC int bc_error_stack_has_too_few_elements(void)
+{
+ ERROR_RETURN(return) bc_error("stack has too few elements");
+}
+static ERRORFUNC int bc_error_variable_is_wrong_type(void)
+{
+ ERROR_RETURN(return) bc_error("variable is wrong type");
+}
+static ERRORFUNC int bc_error_nested_read_call(void)
+{
+ ERROR_RETURN(return) bc_error("read() call inside of a read() call");
}
#if ENABLE_BC
static int bc_POSIX_requires(const char *msg)
@@ -1038,30 +1075,6 @@
return bc_posix_error_fmt("%san empty %s expression in a for loop", "POSIX does not allow ", msg);
}
#endif
-static int bc_error_bad_character(char c)
-{
- return bc_error_fmt("bad character '%c'", c);
-}
-static int bc_error_bad_expression(void)
-{
- return bc_error("bad expression");
-}
-static int bc_error_bad_token(void)
-{
- return bc_error("bad token");
-}
-static int bc_error_stack_has_too_few_elements(void)
-{
- return bc_error("stack has too few elements");
-}
-static int bc_error_variable_is_wrong_type(void)
-{
- return bc_error("variable is wrong type");
-}
-static int bc_error_nested_read_call(void)
-{
- return bc_error("read() call inside of a read() call");
-}
static void bc_vec_grow(BcVec *v, size_t n)
{