Skip to content

Commit 699eb97

Browse files
inkydragonsteppi
authored andcommitted
BUG: special: fix array index out of bound for pro_rad2 (#21797)
* BUG: special.pro_rad2 fix array index out of bound * TST: add test for special.pro_rad2
1 parent f1d66f8 commit 699eb97

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

include/xsf/specfun/specfun.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3584,7 +3584,7 @@ inline Status kmn(int m, int n, T c, T cv, int kd, T *df, T *dn, T *ck1, T *ck2)
35843584
dn[m] = pow(-1, ip) * dnp * cs / ((2.0 * m - 1.0) * (2.0 * m + 1.0 - 4.0 * ip) * tp[m]);
35853585

35863586
for (k = m + 2; k <= nn; k++)
3587-
dn[k - 1] *= rk[k - 1];
3587+
dn[k - 1] = rk[k - 1] * dn[k - 2];
35883588

35893589
r1 = 1.0;
35903590
for (j = 1; j <= (n + m + ip) / 2; j++) {
@@ -3631,10 +3631,10 @@ inline Status kmn(int m, int n, T c, T cv, int kd, T *df, T *dn, T *ck1, T *ck2)
36313631
for (j = 1; j <= m; ++j)
36323632
r5 = r5 * (j + m) / c;
36333633

3634-
g0 = dn[m - 1];
3635-
36363634
if (m == 0)
36373635
g0 = df[0];
3636+
else
3637+
g0 = dn[m - 1];
36383638

36393639
sb0 = (ip + 1.0) * pow(c, ip + 1) / (2.0 * ip * (m - 2.0) + 1.0) / (2.0 * m - 1.0);
36403640
*ck2 = pow(-1, ip) * sb0 * r4 * r5 * g0 / r1 * su0;
@@ -5199,15 +5199,15 @@ Status rmn2sp(int m, int n, T c, T x, T cv, int kd, T *df, T *r2f, T *r2d) {
51995199
sw = 0.0;
52005200
for (k = 1; k <= nm; k++) {
52015201
j = 2 * k - 2 + m + ip;
5202-
su0 += df[k - 1] * qm[j - 1];
5202+
su0 += df[k - 1] * qm[j];
52035203
if ((k > nm1) && (fabs(su0 - sw) < fabs(su0) * eps)) { break; }
52045204
sw = su0;
52055205
}
52065206

52075207
sd0 = 0.0;
52085208
for (k = 1; k <= nm; k++) {
52095209
j = 2 * k - 2 + m + ip;
5210-
sd0 += df[k - 1] * qd[j - 1];
5210+
sd0 += df[k - 1] * qd[j];
52115211
if (k > nm1 && fabs(sd0 - sw) < fabs(sd0) * eps) { break; }
52125212
sw = sd0;
52135213
}
@@ -5219,8 +5219,8 @@ Status rmn2sp(int m, int n, T c, T x, T cv, int kd, T *df, T *r2f, T *r2d) {
52195219
if (j < 0) {
52205220
j = -j - 1;
52215221
}
5222-
su1 += dn[k - 1] * qm[j - 1];
5223-
sd1 += dn[k - 1] * qd[j - 1];
5222+
su1 += dn[k - 1] * qm[j];
5223+
sd1 += dn[k - 1] * qd[j];
52245224
}
52255225

52265226
ga = pow((x - 1.0) / (x + 1.0), 0.5 * m);
@@ -5263,17 +5263,19 @@ Status rmn2sp(int m, int n, T c, T x, T cv, int kd, T *df, T *r2f, T *r2d) {
52635263
}
52645264
su2 = 0.0;
52655265
ki = (2 * m + 1 + ip) / 2;
5266+
ki = std::max(1, ki);
5267+
assert((ki-1) >= 0);
52665268
nm3 = nm + ki;
52675269
for (k = ki; k <= nm3; k++) {
52685270
j = 2 * k - 1 - m - ip;
5269-
su2 += dn[k - 1] * pm[j - 1];
5271+
su2 += dn[k - 1] * pm[j];
52705272
if ((j > m) && (fabs(su2 - sw) < fabs(su2) * eps)) { break; }
52715273
sw = su2;
52725274
}
52735275
sd2 = 0.0;
52745276
for (k = ki; k < nm3; k++) {
52755277
j = 2 * k - 1 - m - ip;
5276-
sd2 += dn[k - 1] * pd[j - 1];
5278+
sd2 += dn[k - 1] * pd[j];
52775279
if (j > m && fabs(sd2 - sw) < fabs(sd2) * eps) { break; }
52785280
sw = sd2;
52795281
}

0 commit comments

Comments
 (0)