From f6f7319792479bad067a700d1d056de1f31b5ede Mon Sep 17 00:00:00 2001 From: Giles Atkinson <“gatk555@gmail.com”> Date: Wed, 8 Nov 2023 11:52:12 +0000 Subject: [PATCH] Add null-pointer checks to some code that crashed when trying to .print results from a non-existent analysis. Also remove the troublesome .plot and .print lines from two examples. --- examples/xspice/original-examples/diffpair.in | 8 +++--- examples/xspice/original-examples/mosmem.in | 4 +-- src/spicelib/analysis/cktacct.c | 27 +++++++++++++------ 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/examples/xspice/original-examples/diffpair.in b/examples/xspice/original-examples/diffpair.in index da321ce89..acaf2bad6 100644 --- a/examples/xspice/original-examples/diffpair.in +++ b/examples/xspice/original-examples/diffpair.in @@ -19,10 +19,10 @@ q4 7 7 9 qnl rbias 7 8 20k .model qnl npn(bf=80 rb=100 ccs=2pf tf=0.3ns tr=6ns cje=3pf cjc=2pf + va=50) -.print dc v(4) v(5) -.plot dc v(5) -.print ac vm(5) vp(5) -.plot ac vm(5) vp(5) +*.print dc v(4) v(5) +*.plot dc v(5) +*.print ac vm(5) vp(5) +*.plot ac vm(5) vp(5) .print tran v(4) v(5) .plot tran v(5) .end diff --git a/examples/xspice/original-examples/mosmem.in b/examples/xspice/original-examples/mosmem.in index 2654ca8ec..82e36d96b 100644 --- a/examples/xspice/original-examples/mosmem.in +++ b/examples/xspice/original-examples/mosmem.in @@ -21,7 +21,7 @@ m11 8 4 0 0 mod w=250u l=5u m12 9 9 8 0 mod w=5u l=5u .model mod nmos(vto=0.5 phi=0.7 kp=1.0e-6 gamma=1.83 lambda=0.115 + level=1 cgso=1u cgdo=1u cbd=50p cbs=50p) -.print dc v(5) v(6) -.plot dc v(6) +*.print dc v(5) v(6) +*.plot dc v(6) .plot tran v(6) v(5) v(7) v(1) v(2) .end diff --git a/src/spicelib/analysis/cktacct.c b/src/spicelib/analysis/cktacct.c index 91253f90b..44f3c85c4 100644 --- a/src/spicelib/analysis/cktacct.c +++ b/src/spicelib/analysis/cktacct.c @@ -57,11 +57,18 @@ CKTacct(CKTcircuit *ckt, JOB *anal, int which, IFvalue *val) case OPT_FILLNZ: if ( ckt->CKTmatrix != NULL ) { #ifdef KLU - if (ckt->CKTmatrix->CKTkluMODE) - val->iValue = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->lnz + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->unz - - (int)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNZ ; - else + if (ckt->CKTmatrix->CKTkluMODE) { + if (!ckt->CKTmatrix->SMPkluMatrix || + !ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric) { + return -1; + } + val->iValue = + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->lnz + + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->unz - + (int)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNZ ; + } else { val->iValue = spFillinCount(ckt->CKTmatrix->SPmatrix); + } #else val->iValue = spFillinCount(ckt->CKTmatrix->SPmatrix); #endif @@ -72,10 +79,14 @@ CKTacct(CKTcircuit *ckt, JOB *anal, int which, IFvalue *val) case OPT_TOTALNZ: if ( ckt->CKTmatrix != NULL ) { #ifdef KLU - if (ckt->CKTmatrix->CKTkluMODE) - val->iValue = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->lnz + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->unz ; - else - val->iValue = spElementCount(ckt->CKTmatrix->SPmatrix); + if (ckt->CKTmatrix->CKTkluMODE && ckt->CKTmatrix->SMPkluMatrix && + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric) { + val->iValue = + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->lnz + + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->unz ; + } else { + val->iValue = 0; + } #else val->iValue = spElementCount(ckt->CKTmatrix->SPmatrix); #endif