Jani Hakala <jahak...@iki.fi> writes:

> Hi,
>
> I found out that there seems to be two similar cases in srfi-4.scm

Thanks for the great work!

Attached is a patch for this.

>From 804f461b413a49ff5021f742ba289f12d282144b Mon Sep 17 00:00:00 2001
From: megane <megan...@gmail.com>
Date: Mon, 18 Nov 2019 16:02:20 +0200
Subject: [PATCH] Fix allocation sizes for u32vector-ref, s32vector-ref

The c functions might ultimately call C_bignum1, which needs 5 words.

Found by Jani Hakala.
---
 c-platform.scm | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/c-platform.scm b/c-platform.scm
index 87f36698..e291e978 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -78,6 +78,7 @@
 (define default-units '(library eval))
 
 (define words-per-flonum 4)
+(define min-words-per-bignum 5)
 
 (eq-inline-operator "C_eqp")
 (membership-test-operators
@@ -1074,8 +1075,8 @@
 (rewrite 'srfi-4#s16vector-ref 2 2 "C_u_i_s16vector_ref" #f)
 (rewrite 'srfi-4#s16vector-ref 2 2 "C_i_s16vector_ref" #t)
 
-(rewrite 'srfi-4#u32vector-ref 16 2 "C_a_i_u32vector_ref" #t words-per-flonum)
-(rewrite 'srfi-4#s32vector-ref 16 2 "C_a_i_s32vector_ref" #t words-per-flonum)
+(rewrite 'srfi-4#u32vector-ref 16 2 "C_a_i_u32vector_ref" #t 
min-words-per-bignum)
+(rewrite 'srfi-4#s32vector-ref 16 2 "C_a_i_s32vector_ref" #t 
min-words-per-bignum)
 
 (rewrite 'srfi-4#f32vector-ref 16 2 "C_a_u_i_f32vector_ref" #f 
words-per-flonum)
 (rewrite 'srfi-4#f32vector-ref 16 2 "C_a_i_f32vector_ref" #t words-per-flonum)
-- 
2.17.1


>
> (define u32vector-ref
>   (getter-with-setter
>      (lambda (x i) (##core#inline_allocate ("C_a_i_u32vector_ref" 4) x i))
>      u32vector-set!
>         "(chicken.srfi-4#u32vector-ref v i)"))
>
> (define s32vector-ref
>   (getter-with-setter
>      (lambda (x i) (##core#inline_allocate ("C_a_i_s32vector_ref" 4) x i))
>      s32vector-set!
>      "(chicken.srfi-4#s32vector-ref v)))
>
>
> Since C_a_i_u32vector_ref and C_a_i_s32vector_ref may end up calling
> bignum1, there should probably be 5 bytes allocated instead of 4.
>
> I found this by compiling chicken with gcc -fsanitize=address
> -fsanitize=aligment, and by linking also related libraries. Address
> sanitizer then reported potential problems.
>
> Jani

Reply via email to