Skip to content

Commit 7f38987

Browse files
committedDec 22, 2024·
Merge branch 'ubsan'
Should fix "ubsan issue" of CRAN: argument resid in Linpack call could be a null pointer. In that case resid was not needed nor referenced in the Linpack function, but it was a null pointer any way.
2 parents 1499ab9 + e9e2cb1 commit 7f38987

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed
 

‎src/getF.c

+14-17
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ static void qrXw(double *qr, int rank, double *qraux, int *pivot, double *X,
180180
double *w, int nr, int nc, int discard)
181181
{
182182
int i, j, ij, len = nr*nc, info = 0, qrkind;
183-
double dummy = 0, wsqrt;
183+
double dummy[1] = {0.0}, wsqrt;
184184
double *xwork = (double *) R_alloc(len, sizeof(double));
185185
/* Extract R from qr into upper triangle of X */
186186
for(i = 0; i < len; i++)
@@ -201,7 +201,7 @@ static void qrXw(double *qr, int rank, double *qraux, int *pivot, double *X,
201201
for(j = 0; j < nc; j++) {
202202
if (pivot[j] >= 0)
203203
F77_CALL(dqrsl)(qr, &nr, &nr, &rank, qraux, xwork + j*nr,
204-
X + pivot[j]*nr, &dummy, &dummy, &dummy, &dummy,
204+
X + pivot[j]*nr, dummy, dummy, dummy, dummy,
205205
&qrkind, &info);
206206
}
207207

@@ -331,13 +331,10 @@ SEXP do_getF(SEXP perms, SEXP E, SEXP QR, SEXP QZ, SEXP effects,
331331
}
332332

333333
double *fitted = (double *) R_alloc(nr * nc, sizeof(double));
334-
/* separate resid needed only in some cases */
335-
double *resid;
336-
if (PARTIAL || FIRST)
337-
resid = (double *) R_alloc(nr * nc, sizeof(double));
334+
double *resid = (double *) R_alloc(nr * nc, sizeof(double));
338335
/* work array and variables for QR decomposition */
339336
double *qty = (double *) R_alloc(nr, sizeof(double));
340-
double dummy = 0.0;
337+
double dummy[1] = {0.0};
341338
int info, qrkind;
342339
/* Weighted methods currently need re-evaluation of QR
343340
decomposition (probably changed in the future, but now for the
@@ -414,16 +411,16 @@ SEXP do_getF(SEXP perms, SEXP E, SEXP QR, SEXP QZ, SEXP effects,
414411
qrkind = RESID;
415412
for(i = 0; i < nc; i++)
416413
F77_CALL(dqrsl)(Zqr, &nr, &nr, &Zqrank, Zqraux, rY + i*nr,
417-
&dummy, qty, &dummy, rY + i*nr, &dummy,
414+
dummy, qty, dummy, rY + i*nr, dummy,
418415
&qrkind, &info);
419416
/* distances need symmetric residuals */
420417
if (DISTBASED) {
421418
transpose(rY, transY, nr, nr);
422419
qrkind = RESID;
423420
for(i = 0; i < nc; i++)
424421
F77_CALL(dqrsl)(Zqr, &nr, &nr, &Zqrank, Zqraux,
425-
transY + i*nr, &dummy, qty, &dummy,
426-
rY + i*nr, &dummy, &qrkind, &info);
422+
transY + i*nr, dummy, qty, dummy,
423+
rY + i*nr, dummy, &qrkind, &info);
427424
}
428425

429426
}
@@ -438,8 +435,8 @@ SEXP do_getF(SEXP perms, SEXP E, SEXP QR, SEXP QZ, SEXP effects,
438435
qrkind = RESID;
439436
for (i = 0; i < nx; i++)
440437
F77_CALL(dqrsl)(Zqr, &nr, &nr, &Zqrank, Zqraux,
441-
qr + i*nr, &dummy, qty, &dummy, qr + i*nr,
442-
&dummy, &qrkind, &info);
438+
qr + i*nr, dummy, qty, dummy, qr + i*nr,
439+
dummy, &qrkind, &info);
443440
}
444441
for(i = 0; i < nx; i++)
445442
pivot[i] = i + 1;
@@ -456,7 +453,7 @@ SEXP do_getF(SEXP perms, SEXP E, SEXP QR, SEXP QZ, SEXP effects,
456453
for (p = 0; p < (nterms - 1); p++) {
457454
for (i = 0; i < nc; i++)
458455
F77_CALL(dqrsl)(qr, &nr, &nr, term + p, qraux, rY + i*nr,
459-
&dummy, qty, &dummy, &dummy, fitted + i*nr,
456+
dummy, qty, dummy, dummy, fitted + i*nr,
460457
&qrkind, &info);
461458
ev = getEV(fitted, nr, nc, DISTBASED);
462459
rans[k + p*nperm] = ev - ev0;
@@ -469,8 +466,8 @@ SEXP do_getF(SEXP perms, SEXP E, SEXP QR, SEXP QZ, SEXP effects,
469466
else
470467
qrkind = FIT;
471468
for (i = 0; i < nc; i++)
472-
F77_CALL(dqrsl)(qr, &nr, &nr, &qrank, qraux, rY + i*nr, &dummy,
473-
qty, &dummy, resid + i*nr, fitted + i*nr,
469+
F77_CALL(dqrsl)(qr, &nr, &nr, &qrank, qraux, rY + i*nr, dummy,
470+
qty, dummy, resid + i*nr, fitted + i*nr,
474471
&qrkind, &info);
475472

476473
/* Eigenvalues: either sum of all or the first If the sum of
@@ -485,8 +482,8 @@ SEXP do_getF(SEXP perms, SEXP E, SEXP QR, SEXP QZ, SEXP effects,
485482
qrkind = FIT;
486483
for(i = 0; i < nc; i++)
487484
F77_CALL(dqrsl)(qr, &nr, &nr, &qrank, qraux,
488-
transY + i*nr, &dummy, qty, &dummy,
489-
&dummy, fitted + i*nr, &qrkind, &info);
485+
transY + i*nr, dummy, qty, dummy,
486+
dummy, fitted + i*nr, &qrkind, &info);
490487
ev1 = eigenfirst(fitted, nr);
491488
} else {
492489
ev1 = svdfirst(fitted, nr, nc);

0 commit comments

Comments
 (0)
Please sign in to comment.