diff options
author | Jim Blandy <jimb@red-bean.com> | 1996-12-18 21:41:44 +0000 |
---|---|---|
committer | Jim Blandy <jimb@red-bean.com> | 1996-12-18 21:41:44 +0000 |
commit | 35de7ebe4a2f424a49bdcc856baaa0d61b978809 (patch) | |
tree | 3606546c63e3b1b3e15df9718e176f8055cf0c30 /libguile/unif.c | |
parent | 407775cb81cb5e254dfbacc3644ea888e694b7f2 (diff) | |
download | guile-35de7ebe4a2f424a49bdcc856baaa0d61b978809.tar.gz |
Give GCC more control flow information, so it can be sure that
variables aren't used uninitialized.
* error.h (scm_error, scm_syserror, scm_syserror_msg,
scm_sysmissing, scm_num_overflow, scm_out_of_range,
scm_wrong_num_args, scm_wrong_type_arg, scm_memory_error,
scm_misc_error): Tell GCC that these functions never return.
* struct.c (scm_struct_ref, scm_struct_set_x): If we can't figure
out the field type, call abort if SCM_ASSERT returns, to placate
the optimizer.
* stacks.c (scm_make_stack, scm_last_stack_frame): abort if
scm_wta ever returns. We can't handle this case anyway, and this
gives the optimizer more information.
* unif.c (scm_uniform_vector_ref, scm_array_set_x): Abort if
scm_wta ever returns.
In some cases, the code is fine, but GCC isn't smart enough to
figure that out; this usually happens when one variable is only
initialized and used when a particular condition holds true, and
we know that condition will never change within a given invocation
of the function. In this case, we simply initialize the variables
to placate the compiler, hopefully to a value which will cause a
crash if it is ever actually used.
* print.c (scm_iprin1): Initialize mw_pos.
* read.c (scm_lreadrecparen): Initialize tl2, ans2.
* throw.c (scm_ithrow): Initialize dynpair.
* unif.c (scm_uniform_vector_ref): Initialize cra.
* struct.c (init_struct): Initialize prot.
* mbstrings.c (scm_print_mb_symbol): Initialize mw_pos and inc.
Diffstat (limited to 'libguile/unif.c')
-rw-r--r-- | libguile/unif.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/libguile/unif.c b/libguile/unif.c index 9f3aeefb2..922101722 100644 --- a/libguile/unif.c +++ b/libguile/unif.c @@ -469,7 +469,6 @@ scm_aind (ra, args, what) register scm_sizet k = SCM_ARRAY_NDIM (ra); scm_array_dim *s = SCM_ARRAY_DIMS (ra); if (SCM_INUMP (args)) - { SCM_ASSERT (1 == k, scm_makfrom0str (what), SCM_WNA, NULL); return pos + (SCM_INUM (args) - s->lbnd) * (s->inc); @@ -1041,14 +1040,13 @@ scm_uniform_vector_ref (v, args) SCM args; { long pos; - if (SCM_IMP (v)) + if (SCM_IMP (v)) { SCM_ASRTGO (SCM_NULLP (args), badarg); return v; } else if (SCM_ARRAYP (v)) - { pos = scm_aind (v, args, s_uniform_vector_ref); v = SCM_ARRAY_V (v); @@ -1075,7 +1073,9 @@ scm_uniform_vector_ref (v, args) default: if (SCM_NULLP (args)) return v; - badarg:scm_wta (v, (char *) SCM_ARG1, s_uniform_vector_ref); + badarg: + scm_wta (v, (char *) SCM_ARG1, s_uniform_vector_ref); + abort (); outrng:scm_out_of_range (s_uniform_vector_ref, SCM_MAKINUM (pos)); wna: scm_wrong_num_args (scm_makfrom0str (s_uniform_vector_ref)); case scm_tc7_smob: @@ -1236,7 +1236,6 @@ scm_array_set_x (v, obj, args) long pos; SCM_ASRTGO (SCM_NIMP (v), badarg1); if (SCM_ARRAYP (v)) - { pos = scm_aind (v, args, s_array_set_x); v = SCM_ARRAY_V (v); @@ -1244,7 +1243,6 @@ scm_array_set_x (v, obj, args) else { if (SCM_NIMP (args)) - { SCM_ASSERT (SCM_CONSP (args) && SCM_INUMP (SCM_CAR (args)), args, SCM_ARG2, s_array_set_x); pos = SCM_INUM (SCM_CAR (args)); @@ -1259,8 +1257,9 @@ scm_array_set_x (v, obj, args) } switch (SCM_TYP7 (v)) { - default: - badarg1:scm_wta (v, (char *) SCM_ARG1, s_array_set_x); + default: badarg1: + scm_wta (v, (char *) SCM_ARG1, s_array_set_x); + abort (); outrng:scm_out_of_range (s_array_set_x, SCM_MAKINUM (pos)); wna: scm_wrong_num_args (scm_makfrom0str (s_array_set_x)); case scm_tc7_smob: /* enclosed */ @@ -1439,18 +1438,20 @@ scm_uniform_array_read_x (ra, port) SCM ra; SCM port; { - SCM cra, v = ra; + SCM cra = SCM_UNDEFINED, v = ra; long sz, len, ans; long start = 0; + if (SCM_UNBNDP (port)) - port = scm_cur_inp; + port = scm_cur_inp; else - SCM_ASSERT (SCM_NIMP (port) && SCM_OPINFPORTP (port), port, SCM_ARG2, s_uniform_array_read_x); + SCM_ASSERT (SCM_NIMP (port) && SCM_OPINFPORTP (port), port, SCM_ARG2, + s_uniform_array_read_x); SCM_ASRTGO (SCM_NIMP (v), badarg1); + len = SCM_LENGTH (v); loop: - switch SCM_TYP7 - (v) + switch SCM_TYP7 (v) { default: badarg1:scm_wta (v, (char *) SCM_ARG1, s_uniform_array_read_x); @@ -1495,19 +1496,25 @@ loop: break; #endif } + /* An ungetc before an fread will not work on some systems if setbuf(0). do #define NOSETBUF in scmfig.h to fix this. */ if (SCM_CRDYP (port)) - { /* UGGH!!! */ ungetc (SCM_CGETUN (port), (FILE *)SCM_STREAM (port)); SCM_CLRDY (port); /* Clear ungetted char */ } - SCM_SYSCALL (ans = fread (SCM_CHARS (v) + start * sz, (scm_sizet) sz, (scm_sizet) len, (FILE *)SCM_STREAM (port))); + + SCM_SYSCALL (ans = fread (SCM_CHARS (v) + start * sz, + (scm_sizet) sz, (scm_sizet) len, + (FILE *)SCM_STREAM (port))); + if (SCM_TYP7 (v) == scm_tc7_bvect) ans *= SCM_LONG_BIT; + if (v != ra && cra != ra) scm_array_copy_x (cra, ra); + return SCM_MAKINUM (ans); } |