diff options
author | Ludovic Courtès <ludo@gnu.org> | 2009-12-14 23:11:47 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2009-12-15 01:01:16 +0100 |
commit | 3dbbe28dfd90cd7bf68d8d07771dffc724064311 (patch) | |
tree | 32dc56d5a966e1f895dd8c028d0f1ea9379016d3 /libguile/objcodes.c | |
parent | cd169c5a2284c019b3909de67fc0e3f2b0a5dd44 (diff) | |
download | guile-3dbbe28dfd90cd7bf68d8d07771dffc724064311.tar.gz |
Don't use GCC zero-length arrays.
* libguile/frames.c, libguile/objcodes.c, libguile/programs.c,
libguile/vm-engine.c, libguile/vm-i-system.c, libguile/vm.c: Use
`SCM_C_OBJCODE_BASE ()' instead of accessing the `base' field of
`struct scm_objcode'.
* libguile/objcodes.h (struct scm_objcode)[base]: Remove.
Diffstat (limited to 'libguile/objcodes.c')
-rw-r--r-- | libguile/objcodes.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/libguile/objcodes.c b/libguile/objcodes.c index 1b896df42..87ffaa5d1 100644 --- a/libguile/objcodes.c +++ b/libguile/objcodes.c @@ -106,17 +106,19 @@ scm_c_make_objcode_slice (SCM parent, const scm_t_uint8 *ptr) #define FUNC_NAME "make-objcode-slice" { const struct scm_objcode *data, *parent_data; + const scm_t_uint8 *parent_base; SCM ret; SCM_VALIDATE_OBJCODE (1, parent); parent_data = SCM_OBJCODE_DATA (parent); - - if (ptr < parent_data->base - || ptr >= (parent_data->base + parent_data->len + parent_data->metalen + parent_base = SCM_C_OBJCODE_BASE (parent_data); + + if (ptr < parent_base + || ptr >= (parent_base + parent_data->len + parent_data->metalen - sizeof (struct scm_objcode))) scm_misc_error (FUNC_NAME, "offset out of bounds (~a vs ~a + ~a + ~a)", - scm_list_4 (scm_from_ulong ((unsigned long)ptr), - scm_from_ulong ((unsigned long)parent_data->base), + scm_list_4 (scm_from_ulong ((unsigned long) ptr), + scm_from_ulong ((unsigned long) parent_base), scm_from_uint32 (parent_data->len), scm_from_uint32 (parent_data->metalen))); @@ -125,9 +127,9 @@ scm_c_make_objcode_slice (SCM parent, const scm_t_uint8 *ptr) assert ((((scm_t_bits) ptr) & (alignof_type (struct scm_objcode) - 1UL)) == 0); - data = (struct scm_objcode*)ptr; - if (data->base + data->len + data->metalen > parent_data->base + parent_data->len + parent_data->metalen) - abort (); + data = (struct scm_objcode*) ptr; + assert (SCM_C_OBJCODE_BASE (data) + data->len + data->metalen + <= parent_base + parent_data->len + parent_data->metalen); SCM_NEWSMOB2 (ret, scm_tc16_objcode, data, parent); SCM_SET_SMOB_FLAGS (ret, SCM_F_OBJCODE_IS_SLICE); |