https://gitlab.com/gnu-clisp/clisp/-/commit/e6b9b9548c5fad2c9f14134669ebc73f2599105a From e6b9b9548c5fad2c9f14134669ebc73f2599105a Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 6 Oct 2026 17:16:38 +0200 Subject: [PATCH] Don't write pointer[-(uintP)offset]. Reported by clang's undefined-behaviour sanitizer. * intlog.d (I_I_logbitp): Write 'pointer-(uintP)offset' instead of '&pointer[-(uintP)offset]'. * intplus.d (I_I_plus_I, I_I_minus_I): Likewise. * intmal.d (square_2bigloop_down, mulu_2bigloop_down, DS_DS_mult_DS): Likewise. * intdiv.d (UDS_divide_): Likewise. * intgcd.d (I_I_gcd_I, partial_gcd, NUDS_likobi0_NUDS, NUDS_likobi1_NUDS, NUDS_likobi2_NUDS, I_I_xgcd_I_I_I): Likewise. * intsqrt.d (I_rootp): Likewise. diff --git a/src/intdiv.d b/src/intdiv.d index 30296f934..699d22c3f 100644 --- a/src/intdiv.d +++ b/src/intdiv.d @@ -164,7 +164,7 @@ } # Nun r = r_MSDptr/a_len+1/r_LSDptr. var uintC j = a_len-b_len; # m-n - var uintD* r_ptr = &r_LSDptr[-(uintP)j]; # Pointer oberhalb von r[j] + var uintD* r_ptr = r_LSDptr-(uintP)j; # Pointer oberhalb von r[j] var uintD* q_MSDptr = r_MSDptr; var uintC q_len = j = j+1; # q wird m-n+1 Digits haben var uintD b_msd = b_MSDptr[0]; # b[n-1] diff --git a/src/intgcd.d b/src/intgcd.d index 24f4e3b06..fac1b0371 100644 --- a/src/intgcd.d +++ b/src/intgcd.d @@ -223,7 +223,7 @@ label_3: # a,b >0, beide ungerade, a>b # subtrahiere a := a - b if (!( subfrom_loop_down(b_LSDptr,a_LSDptr,b_len) ==0)) - dec_loop_down(&a_LSDptr[-(uintP)b_len],a_len-b_len); + dec_loop_down(a_LSDptr-(uintP)b_len,a_len-b_len); # normalisieren while (a_MSDptr[0] == 0) { a_MSDptr++; a_len--; @@ -735,11 +735,11 @@ } # c := x1*a-y1*b bilden: mulu_loop_down(likobi.x1,a_LSDptr,c_LSDptr,a_len); - /* c_LSDptr[-(uintP)a_len-1] -= */ + /* *(c_LSDptr-(uintP)a_len-1) -= */ mulusub_loop_down(likobi.y1,b_LSDptr,c_LSDptr,a_len); # d := -x2*a+y2*b bilden: mulu_loop_down(likobi.y2,b_LSDptr,d_LSDptr,a_len); - /* d_LSDptr[-(uintP)a_len-1] -= */ + /* *(d_LSDptr-(uintP)a_len-1) -= */ mulusub_loop_down(likobi.x2,a_LSDptr,d_LSDptr,a_len); # Wir wissen, dass 0 < c < b und 0 < d < a. Daher müssten # c_LSDptr[-a_len-1] und d_LSDptr[-a_len-1] =0 sein. @@ -823,15 +823,15 @@ var uintC v_len = v->len; if (u_len >= v_len) { if (!( addto_loop_down(v->LSDptr,u->LSDptr,v_len) ==0)) { - if (!( inc_loop_down(&(u->LSDptr)[-(uintP)v_len],u_len-v_len) ==0)) { + if (!( inc_loop_down((u->LSDptr)-(uintP)v_len,u_len-v_len) ==0)) { *--(u->MSDptr) = 1; u->len++; } } } else { # u_len <= v_len - u->MSDptr = copy_loop_down(&(v->LSDptr)[-(uintP)u_len],&(u->LSDptr)[-(uintP)u_len],v_len-u_len); + u->MSDptr = copy_loop_down((v->LSDptr)-(uintP)u_len,(u->LSDptr)-(uintP)u_len,v_len-u_len); u->len = v_len; if (!( addto_loop_down(v->LSDptr,u->LSDptr,u_len) ==0)) { - if (!( inc_loop_down(&(u->LSDptr)[-(uintP)u_len],v_len-u_len) ==0)) { + if (!( inc_loop_down((u->LSDptr)-(uintP)u_len,v_len-u_len) ==0)) { *--(u->MSDptr) = 1; u->len++; } } @@ -851,7 +851,7 @@ } # Nun ist u_len > v_len. carry = muluadd_loop_down(q,v->LSDptr,u->LSDptr,v_len); if (!(carry==0)) { - var uintD* ptr = &(u->LSDptr)[-(uintP)v_len-1]; + var uintD* ptr = (u->LSDptr)-(uintP)v_len-1; if ((ptr[0] += carry) < carry) { if (!( inc_loop_down(ptr,u_len-v_len-1) ==0)) { *--(u->MSDptr) = 1; u->len++; @@ -880,10 +880,10 @@ var uintD carry = muluadd_loop_down(q->y1,v->LSDptr,c_LSDptr,v_len); if (!(carry==0)) { - var uintD* ptr = &c_LSDptr[-(uintP)v_len-1]; + var uintD* ptr = c_LSDptr-(uintP)v_len-1; if ((ptr[0] += carry) < carry) { if (!( inc_loop_down(ptr,u_len-v_len) ==0)) { - c_len++; c_LSDptr[-(uintP)c_len] = 1; + c_len++; *(c_LSDptr-(uintP)c_len) = 1; } } } @@ -892,10 +892,10 @@ var uintD carry = muluadd_loop_down(q->y2,v->LSDptr,d_LSDptr,v_len); if (!(carry==0)) { - var uintD* ptr = &d_LSDptr[-(uintP)v_len-1]; + var uintD* ptr = d_LSDptr-(uintP)v_len-1; if ((ptr[0] += carry) < carry) { if (!(inc_loop_down(ptr,u_len-v_len) ==0)) { - d_len++; d_LSDptr[-(uintP)d_len] = 1; + d_len++; *(d_LSDptr-(uintP)d_len) = 1; } } } @@ -909,10 +909,10 @@ var uintD carry = muluadd_loop_down(q->x1,u->LSDptr,c_LSDptr,u_len); if (!(carry==0)) { - var uintD* ptr = &c_LSDptr[-(uintP)u_len-1]; + var uintD* ptr = c_LSDptr-(uintP)u_len-1; if ((ptr[0] += carry) < carry) { if (!( inc_loop_down(ptr,v_len-u_len) ==0)) { - c_len++; c_LSDptr[-(uintP)c_len] = 1; + c_len++; *(c_LSDptr-(uintP)c_len) = 1; } } } @@ -921,10 +921,10 @@ var uintD carry = muluadd_loop_down(q->x2,u->LSDptr,d_LSDptr,u_len); if (!(carry==0)) { - var uintD* ptr = &d_LSDptr[-(uintP)u_len-1]; + var uintD* ptr = d_LSDptr-(uintP)u_len-1; if ((ptr[0] += carry) < carry) { if (!( inc_loop_down(ptr,v_len-u_len) ==0)) { - d_len++; d_LSDptr[-(uintP)d_len] = 1; + d_len++; *(d_LSDptr-(uintP)d_len) = 1; } } } @@ -1154,11 +1154,11 @@ } # c := x1*a-y1*b bilden: mulu_loop_down(likobi.x1,a_LSDptr,c_LSDptr,a_len); - /* c_LSDptr[-(uintP)a_len-1] -= */ + /* *(c_LSDptr-(uintP)a_len-1) -= */ mulusub_loop_down(likobi.y1,b_LSDptr,c_LSDptr,a_len); # d := -x2*a+y2*b bilden: mulu_loop_down(likobi.y2,b_LSDptr,d_LSDptr,a_len); - /* d_LSDptr[-(uintP)a_len-1] -= */ + /* *(d_LSDptr-(uintP)a_len-1) -= */ mulusub_loop_down(likobi.x2,a_LSDptr,d_LSDptr,a_len); # Wir wissen, dass 0 < c < b und 0 < d < a. Daher müssten # c_LSDptr[-a_len-1] und d_LSDptr[-a_len-1] =0 sein. @@ -1199,7 +1199,7 @@ mulu_2loop_down(q.LSDptr,q.len,uAb.LSDptr,uAb.len,c_LSDptr); # q * uAb var DS c; c.LSDptr = c_LSDptr; c.len = q.len + uAb.len; - if (c_LSDptr[-(uintP)c.len]==0) { c.len--; } # normalisieren + if (*(c_LSDptr-(uintP)c.len)==0) { c.len--; } # normalisieren NUDS_likobi0_NUDS(&uAa,&c); # zu uAa addieren } # noch uAa,uAb vertauschen (später) # (uBa,uBb) := (uBb,uBa+q*uBb) : @@ -1207,7 +1207,7 @@ mulu_2loop_down(q.LSDptr,q.len,uBb.LSDptr,uBb.len,c_LSDptr); # q * uBb var DS c; c.LSDptr = c_LSDptr; c.len = q.len + uBb.len; - if (c_LSDptr[-(uintP)c.len]==0) { c.len--; } # normalisieren + if (*(c_LSDptr-(uintP)c.len)==0) { c.len--; } # normalisieren NUDS_likobi0_NUDS(&uBa,&c); # zu uBa addieren } # noch uBa,uBb vertauschen (später) goto a_greater_b_swap; # Nun ist a>b>0 diff --git a/src/intlog.d b/src/intlog.d index a7c77ee6c..a170efce9 100644 --- a/src/intlog.d +++ b/src/intlog.d @@ -514,7 +514,7 @@ local bool I_I_logbitp (object x, object y) I_to_NDS_nocopy(y, _EMA_,ylen=,yLSDptr=); /* DS for y */ if (x_ < intDsize*(uintL)ylen) { /* x is a fixnum >=0, < intDsize*ylen */ - if (yLSDptr[-(uintP)floor(x_,intDsize)-1] & bit(x_%intDsize)) + if (*(yLSDptr-(uintP)floor(x_,intDsize)-1) & bit(x_%intDsize)) return true; else return false; diff --git a/src/intmal.d b/src/intmal.d index 43c8b89f9..0e17ffcbc 100644 --- a/src/intmal.d +++ b/src/intmal.d @@ -176,7 +176,7 @@ local _Noreturn void mal_ueberlauf (void) { add_loop_down(sourceptr-k_lo,sourceptr,sum_LSDptr,k_hi); if (!(k_lo==k_hi)) { # noch k_lo-k_hi = 1 Digits abzulegen - sum_MSDptr[0] = sourceptr[-(uintP)k_lo]; # = sourceptr[-(uintP)k_hi-1] + sum_MSDptr[0] = *(sourceptr-(uintP)k_lo); # = *(sourceptr-(uintP)k_hi-1) if (!(carry==0)) { if (++(sum_MSDptr[0]) == 0) carry=1; @@ -224,7 +224,7 @@ local _Noreturn void mal_ueberlauf (void) { # Falls Carry: Produkt beansprucht 2*k_lo+1 Digits. # Carry um maximal 1 Digit weitertragen: if (!(carry==0)) - prodmid_LSDptr[-2*(uintP)k_lo-1] -= 1; + *(prodmid_LSDptr-2*(uintP)k_lo-1) -= 1; } # prodmid_LSDptr[-prodmid_len..-1] enthält nun 2*x0*x1. # Dies ist < 2 * b^k_lo * b^k_hi = 2 * b^len, @@ -441,10 +441,10 @@ local _Noreturn void mal_ueberlauf (void) { sum1_MSDptr++; # 1 Digit vorne als Reserve { var uintD carry = # Hauptteile von x1 und x0 addieren: - add_loop_down(&sourceptr1[-(uintP)k_lo],sourceptr1,sum1_LSDptr,k_lo); + add_loop_down(sourceptr1-(uintP)k_lo,sourceptr1,sum1_LSDptr,k_lo); if (!(k_lo==k_hi)) { # noch k_hi-k_lo = 1 Digits abzulegen - sum1_MSDptr[0] = sourceptr1[-(uintP)len1]; # = sourceptr1[-2*(uintP)k_lo-1] + sum1_MSDptr[0] = *(sourceptr1-(uintP)len1); # = *(sourceptr1-2*(uintP)k_lo-1) if (!(carry==0)) { if (++(sum1_MSDptr[0]) == 0) carry=1; @@ -466,7 +466,7 @@ local _Noreturn void mal_ueberlauf (void) { var uintD* prod_LSDptr; var uintD* prodhi_LSDptr; num_stack_need(2*(uintL)len1,prod_MSDptr=,prod_LSDptr=); - prodhi_LSDptr = &prod_LSDptr[-2*(uintP)k_lo]; + prodhi_LSDptr = prod_LSDptr-2*(uintP)k_lo; # prod_MSDptr/2*len1/prod_LSDptr wird zuerst die beiden # Produkte x1*y1 in prod_MSDptr/2*k_hi/prodhi_LSDptr # und x0*y0 in prodhi_LSDptr/2*k_lo/prod_LSDptr, @@ -480,17 +480,17 @@ local _Noreturn void mal_ueberlauf (void) { # Produkt x0*y0 berechnen: mulu_2loop_down(sourceptr1,k_lo,sourceptr2,k_lo,prod_LSDptr); # Produkt x1*y1 berechnen: - mulu_2loop_down(&sourceptr1[-(uintP)k_lo],k_hi,&sourceptr2[-(uintP)k_lo],k_hi,prodhi_LSDptr); + mulu_2loop_down(sourceptr1-(uintP)k_lo,k_hi,sourceptr2-(uintP)k_lo,k_hi,prodhi_LSDptr); # Summe y1+y0 berechnen: { var uintC sum2_len = k_hi; # = max(k_lo,k_hi) - var uintD* sum2_MSDptr = &sum2_LSDptr[-(uintP)sum2_len]; + var uintD* sum2_MSDptr = sum2_LSDptr-(uintP)sum2_len; { var uintD carry = # Hauptteile von y1 und y0 addieren: - add_loop_down(&sourceptr2[-(uintP)k_lo],sourceptr2,sum2_LSDptr,k_lo); + add_loop_down(sourceptr2-(uintP)k_lo,sourceptr2,sum2_LSDptr,k_lo); if (!(k_lo==k_hi)) { # noch k_hi-k_lo = 1 Digits abzulegen - sum2_MSDptr[0] = sourceptr2[-(uintP)len1]; # = sourceptr2[-2*(uintP)k_lo-1] + sum2_MSDptr[0] = *(sourceptr2-(uintP)len1); # = sourceptr2[-2*(uintP)k_lo-1] if (!(carry==0)) { if (++(sum2_MSDptr[0]) == 0) carry=1; @@ -514,7 +514,7 @@ local _Noreturn void mal_ueberlauf (void) { # Falls Carry: Produkt beansprucht 2*k_hi+1 Digits. # Carry um maximal 1 Digit weitertragen: if (!(carry==0)) - prodmid_LSDptr[-2*(uintP)k_hi-1] -= 1; + *(prodmid_LSDptr-2*(uintP)k_hi-1) -= 1; } # Und x0*y0 abziehen: { @@ -522,16 +522,16 @@ local _Noreturn void mal_ueberlauf (void) { subfrom_loop_down(prod_LSDptr,prodmid_LSDptr,2*k_lo); # Carry um maximal prodmid_len-2*k_lo Digits weitertragen: if (!(carry==0)) - dec_loop_down(&prodmid_LSDptr[-2*(uintP)k_lo],prodmid_len-2*k_lo); + dec_loop_down(prodmid_LSDptr-2*(uintP)k_lo,prodmid_len-2*k_lo); } # prodmid_LSDptr[-prodmid_len..-1] enthält nun x0*y1+x1*y0. # Dies wird zu prod = x1*y1*b^(2*k) + x0*y0 addiert: { var uintD carry = - addto_loop_down(prodmid_LSDptr,&prod_LSDptr[-(uintP)k_lo],prodmid_len); + addto_loop_down(prodmid_LSDptr,prod_LSDptr-(uintP)k_lo,prodmid_len); # (Benutze dabei k_lo+prodmid_len <= k_lo+2*(k_hi+1) = 2*len1-k_lo+2 <= 2*len1 .) if (!(carry==0)) - inc_loop_down(&prod_LSDptr[-(uintP)(k_lo+prodmid_len)],2*len1-(k_lo+prodmid_len)); + inc_loop_down(prod_LSDptr-(uintP)(k_lo+prodmid_len),2*len1-(k_lo+prodmid_len)); } } # Das Teilprodukt zum Gesamtprodukt addieren: @@ -543,7 +543,7 @@ local _Noreturn void mal_ueberlauf (void) { var uintD carry = addto_loop_down(prod_LSDptr,destptr,len1); destptr -= len1; - copy_loop_down(&prod_LSDptr[-(uintP)len1],destptr,len1); + copy_loop_down(prod_LSDptr-(uintP)len1,destptr,len1); if (!(carry==0)) inc_loop_down(destptr,len1); } @@ -572,11 +572,11 @@ local _Noreturn void mal_ueberlauf (void) { sum1_MSDptr++; # 1 Digit vorne als Reserve { var uintD carry = # x1 und unteren Teil von x0 addieren: - add_loop_down(&sourceptr1[-(uintP)k_lo],sourceptr1,sum1_LSDptr,x1_len); + add_loop_down(sourceptr1-(uintP)k_lo,sourceptr1,sum1_LSDptr,x1_len); # und den oberen Teil von x0 dazu: - copy_loop_down(&sourceptr1[-(uintP)x1_len],&sum1_LSDptr[-(uintP)x1_len],k_lo-x1_len); + copy_loop_down(sourceptr1-(uintP)x1_len,sum1_LSDptr-(uintP)x1_len,k_lo-x1_len); if (!(carry==0)) { - carry = inc_loop_down(&sum1_LSDptr[-(uintP)x1_len],k_lo-x1_len); + carry = inc_loop_down(sum1_LSDptr-(uintP)x1_len,k_lo-x1_len); if (carry) { *--sum1_MSDptr = 1; sum1_len++; @@ -591,10 +591,10 @@ local _Noreturn void mal_ueberlauf (void) { sum2_MSDptr++; # 1 Digit vorne als Reserve { var uintD carry = # Hauptteile von y1 und y0 addieren: - add_loop_down(&sourceptr2[-(uintP)k_lo],sourceptr2,sum2_LSDptr,k_hi); + add_loop_down(sourceptr2-(uintP)k_lo,sourceptr2,sum2_LSDptr,k_hi); if (!(k_lo==k_hi)) { # noch k_lo-k_hi = 1 Digits abzulegen - sum2_MSDptr[0] = sourceptr2[-(uintP)k_lo]; # = sourceptr2[-(uintP)k_hi-1] + sum2_MSDptr[0] = *(sourceptr2-(uintP)k_lo); # = *(sourceptr2-(uintP)k_hi-1) if (!(carry==0)) { if (++(sum2_MSDptr[0]) == 0) carry=1; @@ -609,7 +609,7 @@ local _Noreturn void mal_ueberlauf (void) { } # Platz für Produkte x0*y0, x1*y1: var uintC prodhi_len = x1_len+k_hi; - var uintD* prodhi_LSDptr = &prod_LSDptr[-2*(uintP)k_lo]; + var uintD* prodhi_LSDptr = prod_LSDptr-2*(uintP)k_lo; # prod_MSDptr/len1+len2/prod_LSDptr wird zuerst die beiden # Produkte x1*y1 in prod_MSDptr/x1_len+k_hi/prodhi_LSDptr # und x0*y0 in prodhi_LSDptr/2*k_lo/prod_LSDptr, @@ -626,14 +626,14 @@ local _Noreturn void mal_ueberlauf (void) { mulu_2loop_down(sourceptr1,k_lo,sourceptr2,k_lo,prod_LSDptr); # Produkt x1*y1 berechnen: if (!(x1_len==0)) { - mulu_2loop_down(&sourceptr1[-(uintP)k_lo],x1_len,&sourceptr2[-(uintP)k_lo],k_hi,prodhi_LSDptr); + mulu_2loop_down(sourceptr1-(uintP)k_lo,x1_len,sourceptr2-(uintP)k_lo,k_hi,prodhi_LSDptr); # Und x1*y1 abziehen: { var uintD carry = subfrom_loop_down(prodhi_LSDptr,prodmid_LSDptr,prodhi_len); # Carry um maximal prodmid_len-prodhi_len Digits weitertragen: if (!(carry==0)) - dec_loop_down(&prodmid_LSDptr[-(uintP)prodhi_len],prodmid_len-prodhi_len); + dec_loop_down(prodmid_LSDptr-(uintP)prodhi_len,prodmid_len-prodhi_len); } } else { # Produkt x1*y1=0, nichts abzuziehen @@ -646,7 +646,7 @@ local _Noreturn void mal_ueberlauf (void) { # Falls Carry: Produkt beansprucht 2*k_lo+1 Digits. # Carry um maximal 1 Digit weitertragen: if (!(carry==0)) - prodmid_LSDptr[-2*(uintP)k_lo-1] -= 1; + *(prodmid_LSDptr-2*(uintP)k_lo-1) -= 1; } # prodmid_LSDptr[-prodmid_len..-1] enthält nun x0*y1+x1*y0. # Dies ist < b^k_lo * b^k_hi + b^x1_len * b^k_lo @@ -672,9 +672,9 @@ local _Noreturn void mal_ueberlauf (void) { # prodmid*b^k = (x0*y1+x1*y0)*b^k zu prod = x1*y1*b^(2*k) + x0*y0 addieren: { var uintD carry = - addto_loop_down(prodmid_LSDptr,&prod_LSDptr[-(uintP)k_lo],prodmid_len); + addto_loop_down(prodmid_LSDptr,prod_LSDptr-(uintP)k_lo,prodmid_len); if (!(carry==0)) - inc_loop_down(&prod_LSDptr[-(uintP)(k_lo+prodmid_len)],prod_len-(k_lo+prodmid_len)); + inc_loop_down(prod_LSDptr-(uintP)(k_lo+prodmid_len),prod_len-(k_lo+prodmid_len)); } } # Das Teilprodukt zum Gesamtprodukt addieren: @@ -684,7 +684,7 @@ local _Noreturn void mal_ueberlauf (void) { var uintD carry = addto_loop_down(prod_LSDptr,destptr,len1); destptr -= len1; - copy_loop_down(&prod_LSDptr[-(uintP)len1],destptr,len2); + copy_loop_down(prod_LSDptr-(uintP)len1,destptr,len2); if (!(carry==0)) inc_loop_down(destptr,len2); } @@ -714,10 +714,10 @@ local _Noreturn void mal_ueberlauf (void) { UDS_UDS_mult_UDS(len1,LSDptr1,len2,LSDptr2, MSDptr_assignment,len_assignment,LSDptr_assignment LSDptr0 = ); \ if ((sintD)(MSDptr1[0]) < 0) # n<0 ? \ # muss m bzw. m+b^l subtrahieren, um k Digits verschoben: \ - subfrom_loop_down(LSDptr2,&LSDptr0[-(uintP)len1],len2); \ + subfrom_loop_down(LSDptr2,LSDptr0-(uintP)len1,len2); \ if ((sintD)(MSDptr2[0]) < 0) # m<0 ? \ # muss n bzw. n+b^k subtrahieren, um l Digits verschoben: \ - subfrom_loop_down(LSDptr1,&LSDptr0[-(uintP)len2],len1); \ + subfrom_loop_down(LSDptr1,LSDptr0-(uintP)len2,len1); \ } # (* x y), wo x und y Integers sind. Ergebnis Integer. diff --git a/src/intplus.d b/src/intplus.d index 2d2cbccf9..ed9f1e380 100644 --- a/src/intplus.d +++ b/src/intplus.d @@ -163,7 +163,7 @@ modexp maygc object I_I_plus_I (object x, object y) } # y_ zu den oberen pFN_maxlength Digits von x addieren: { - var uintD* midptr = &LSDptr[-(uintP)pFN_maxlength]; + var uintD* midptr = LSDptr-(uintP)pFN_maxlength; var uintV x_ = pFN_maxlength_digits_at(midptr); var uintV x_new = x_+(uintV)y_; set_pFN_maxlength_digits_at(midptr,x_new); @@ -337,7 +337,7 @@ modexp maygc object I_I_minus_I (object x, object y) # MSDigit ist nun = 0x0000 oder = 0xFFFF # x_ zu den oberen pFN_maxlength Digits von -y addieren: { - var uintD* midptr = &LSDptr[-(uintP)pFN_maxlength]; + var uintD* midptr = LSDptr-(uintP)pFN_maxlength; var uintV y_ = pFN_maxlength_digits_at(midptr); var uintV y_new = y_+(uintV)x_; set_pFN_maxlength_digits_at(midptr,y_new); @@ -379,7 +379,7 @@ modexp maygc object I_I_minus_I (object x, object y) } # y_ von den oberen pFN_maxlength Digits von x subtrahieren: { - var uintD* midptr = &LSDptr[-(uintP)pFN_maxlength]; + var uintD* midptr = LSDptr-(uintP)pFN_maxlength; var uintV x_ = pFN_maxlength_digits_at(midptr); var uintV x_new = x_-(uintV)y_; set_pFN_maxlength_digits_at(midptr,x_new); diff --git a/src/intsqrt.d b/src/intsqrt.d index 37c0d76f2..6ff87b207 100644 --- a/src/intsqrt.d +++ b/src/intsqrt.d @@ -585,7 +585,7 @@ var uintD* zz_LSDptr = z2_LSDptr; var uintD* z_LSDptr; # Ab jetzt {zz_LSDptr,free_LSDptr} = {z1_LSDptr,z2_LSDptr}. - clear_loop_down(&y_LSDptr[-(uintP)k],k2-k); # y auf k2 Digits erweitern + clear_loop_down(y_LSDptr-(uintP)k,k2-k); # y auf k2 Digits erweitern copy_loop_down(y_LSDptr,zz_LSDptr,k2); # zz:=y do { var uintD* new_zz_LSDptr = free_LSDptr; @@ -615,16 +615,16 @@ zz_LSDptr = z3_LSDptr; # zz ist jetzt auch frei mulu_2loop_down(z_LSDptr,k2,y_LSDptr,k2,free_LSDptr); # y^n sub_loop_down(x_LSDptr,free_LSDptr,zz_LSDptr,k2); # zz:=x-y^n - ASSERT(!test_loop_up(&zz_LSDptr[-(uintP)k],k)); # zz == 0 mod beta^k + ASSERT(!test_loop_up(zz_LSDptr-(uintP)k,k)); # zz == 0 mod beta^k mulu_2loop_down(z_LSDptr,k2-k,n_LSDptr,n_len,free_LSDptr); # n*y^(n-1) # Quotienten mod beta^(k2-k) bilden und an y mod beta^k ankleben: - UDS_UDS_div2adic_UDS(k2-k,&zz_LSDptr[-(uintP)k],free_LSDptr,&y_LSDptr[-(uintP)k]); + UDS_UDS_div2adic_UDS(k2-k,zz_LSDptr-(uintP)k,free_LSDptr,y_LSDptr-(uintP)k); k = k2; # jetzt gilt y^n == x sogar mod beta^k2. } end_arith_call(); } # y mit y^n == x mod beta^m ist gefunden. - var object y = UDS_to_I(&y_LSDptr[-(uintP)m],m); # y als Integer >=0 + var object y = UDS_to_I(y_LSDptr-(uintP)m,m); # y als Integer >=0 RESTORE_NUM_STACK # num_stack zurück pushSTACK(y); # Stackaufbau: x, y. -- 2.49.1