Code coverage tests

This page documents the degree to which the PARI/GP source code is tested by our public test suite, distributed with the source distribution in directory src/test/. This is measured by the gcov utility; we then process gcov output using the lcov frond-end.

We test a few variants depending on Configure flags on the pari.math.u-bordeaux.fr machine (x86_64 architecture), and agregate them in the final report:

The target is to exceed 90% coverage for all mathematical modules (given that branches depending on DEBUGLEVEL or DEBUGMEM are not covered). This script is run to produce the results below.

LCOV - code coverage report
Current view: top level - kernel/none - add.c (source / functions) Coverage Total Hit
Test: PARI/GP v2.18.1 lcov report (development 31042-0fbe168e69) Lines: 100.0 % 187 187
Test Date: 2026-07-23 17:04:59 Functions: 100.0 % 10 10
Legend: Lines:     hit not hit

            Line data    Source code
       1              : #line 2 "../src/kernel/none/add.c"
       2              : /* Copyright (C) 2002-2003  The PARI group.
       3              : 
       4              : This file is part of the PARI/GP package.
       5              : 
       6              : PARI/GP is free software; you can redistribute it and/or modify it under the
       7              : terms of the GNU General Public License as published by the Free Software
       8              : Foundation; either version 2 of the License, or (at your option) any later
       9              : version. It is distributed in the hope that it will be useful, but WITHOUT
      10              : ANY WARRANTY WHATSOEVER.
      11              : 
      12              : Check the License for details. You should have received a copy of it, along
      13              : with the package; see the file 'COPYING'. If not, write to the Free Software
      14              : Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
      15              : 
      16              : INLINE GEN
      17   4160612033 : icopy_sign(GEN x, long sx)
      18              : {
      19   4160612033 :   GEN y=icopy(x);
      20   4160612033 :   setsigne(y,sx);
      21   4160612033 :   return y;
      22              : }
      23              : 
      24              : GEN
      25    327310568 : addsi_sign(long x, GEN y, long sy)
      26              : {
      27              :   long sx,ly;
      28              :   GEN z;
      29              : 
      30    327310568 :   if (!x) return icopy_sign(y, sy);
      31    310844120 :   if (!sy) return stoi(x);
      32    180933481 :   if (x<0) { sx=-1; x=-x; } else sx=1;
      33    180933481 :   if (sx==sy)
      34              :   {
      35     50894326 :     z = adduispec(x,y+2, lgefint(y)-2);
      36     50894326 :     setsigne(z,sy); return z;
      37              :   }
      38    130039155 :   ly=lgefint(y);
      39    130039155 :   if (ly==3)
      40              :   {
      41     18137610 :     const long d = (long)(uel(y,2) - (ulong)x);
      42     18137610 :     if (!d) return gen_0;
      43     17115435 :     z=cgeti(3);
      44     17115435 :     if (y[2] < 0 || d > 0) {
      45     14640244 :       z[1] = evalsigne(sy) | evallgefint(3);
      46     14640244 :       z[2] = d;
      47              :     }
      48              :     else {
      49      2475191 :       z[1] = evalsigne(-sy) | evallgefint(3);
      50      2475191 :       z[2] =-d;
      51              :     }
      52     17115435 :     return z;
      53              :   }
      54    111901545 :   z = subiuspec(y+2,x, ly-2);
      55    111901545 :   setsigne(z,sy); return z;
      56              : }
      57              : GEN
      58    244744850 : addui_sign(ulong x, GEN y, long sy)
      59              : {
      60              :   long ly;
      61              :   GEN z;
      62              : 
      63    244744850 :   if (!x) return icopy_sign(y, sy);
      64    241791489 :   if (!sy) return utoipos(x);
      65    233142789 :   if (sy == 1) return adduispec(x,y+2, lgefint(y)-2);
      66    116233829 :   ly=lgefint(y);
      67    116233829 :   if (ly==3)
      68              :   {
      69     29274392 :     const ulong t = y[2];
      70     29274392 :     if (x == t) return gen_0;
      71     26841204 :     z=cgeti(3);
      72     26841204 :     if (x < t) {
      73     25109553 :       z[1] = evalsigne(-1) | evallgefint(3);
      74     25109553 :       z[2] = t - x;
      75              :     }
      76              :     else {
      77      1731651 :       z[1] = evalsigne(1) | evallgefint(3);
      78      1731651 :       z[2] = x - t;
      79              :     }
      80     26841204 :     return z;
      81              :   }
      82     86959437 :   z = subiuspec(y+2,x, ly-2);
      83     86959437 :   setsigne(z,-1); return z;
      84              : }
      85              : 
      86              : /* return gen_0 when the sign is 0 */
      87              : GEN
      88  19758515610 : addii_sign(GEN x, long sx, GEN y, long sy)
      89              : {
      90              :   long lx,ly;
      91              :   GEN z;
      92              : 
      93  19758515610 :   if (!sx) return sy? icopy_sign(y, sy): gen_0;
      94  15600448164 :   if (!sy) return icopy_sign(x, sx);
      95  12707199530 :   lx = lgefint(x);
      96  12707199530 :   ly = lgefint(y);
      97  12707199530 :   if (sx==sy)
      98   6704657393 :     z = addiispec(x+2,y+2,lx-2,ly-2);
      99              :   else
     100              :   { /* sx != sy */
     101   6002542137 :     long i = cmpiispec(x+2,y+2,lx-2,ly-2);
     102   6002542136 :     if (!i) return gen_0;
     103              :     /* we must ensure |x| > |y| for subiispec */
     104   5700265080 :     if (i < 0) {
     105   2319250667 :       sx = sy;
     106   2319250667 :       z = subiispec(y+2,x+2,ly-2,lx-2);
     107              :     }
     108              :     else
     109   3381014413 :       z = subiispec(x+2,y+2,lx-2,ly-2);
     110              :   }
     111  12404922468 :   setsigne(z,sx); return z;
     112              : }
     113              : 
     114              : INLINE GEN
     115    402286758 : rcopy_sign(GEN x, long sx) { GEN y = rcopy(x); setsigne(y,sx); return y; }
     116              : 
     117              : GEN
     118    507707310 : addir_sign(GEN x, long sx, GEN y, long sy)
     119              : {
     120              :   long e, l, ly;
     121              :   GEN z;
     122              : 
     123    507707310 :   if (!sx) return rcopy_sign(y, sy);
     124    160516124 :   e = expo(y) - expi(x);
     125    160516124 :   if (!sy)
     126              :   {
     127       704821 :     if (e >= 0) return rcopy_sign(y, sy);
     128       704773 :     z = itor(x, nbits2prec(-e));
     129       704773 :     setsigne(z, sx); return z;
     130              :   }
     131              : 
     132    159811303 :   ly = lg(y);
     133    159811303 :   if (e > 0)
     134              :   {
     135     43230745 :     l = lg2prec(ly - divsBIL(e));
     136     43230745 :     if (l < LOWDEFAULTPREC) return rcopy_sign(y, sy);
     137              :   }
     138    116580558 :   else l = lg2prec(ly) + nbits2extraprec(-e);
     139    159312838 :   z = (GEN)avma;
     140    159312838 :   y = addrr_sign(itor(x,l), sx, y, sy);
     141   1543895461 :   ly = lg(y); while (ly--) *--z = y[ly];
     142    159312831 :   set_avma((pari_sp)z); return z;
     143              : }
     144              : 
     145              : static GEN
     146    507224758 : addsr_sign(long x, GEN y, long sy)
     147              : {
     148              :   long e, l, ly, sx;
     149              :   GEN z;
     150              : 
     151    507224758 :   if (!x) return rcopy_sign(y, sy);
     152    507211535 :   if (x < 0) { sx = -1; x = -x; } else sx = 1;
     153    507211535 :   e = expo(y) - expu(x);
     154    507211535 :   if (!sy)
     155              :   {
     156       504895 :     if (e >= 0) return rcopy_sign(y, sy);
     157       504867 :     if (sx == -1) x = -x;
     158       504867 :     return stor(x, nbits2prec(-e));
     159              :   }
     160              : 
     161    506706640 :   ly = lg(y);
     162    506706640 :   if (e > 0)
     163              :   {
     164      5070592 :     l = lg2prec(ly - divsBIL(e));
     165      5070592 :     if (l < LOWDEFAULTPREC) return rcopy_sign(y, sy);
     166              :   }
     167    501636048 :   else l = lg2prec(ly) + nbits2extraprec(-e);
     168    505790410 :   z = (GEN)avma;
     169    505790410 :   y = addrr_sign(stor(x,l), sx, y, sy);
     170   6538096773 :   ly = lg(y); while (ly--) *--z = y[ly];
     171    505790410 :   set_avma((pari_sp)z); return z;
     172              : }
     173              : 
     174              : GEN
     175    498082951 : addsr(long x, GEN y) { return addsr_sign(x, y, signe(y)); }
     176              : 
     177              : GEN
     178      9141807 : subsr(long x, GEN y) { return addsr_sign(x, y, -signe(y)); }
     179              : 
     180              : GEN
     181   5334129050 : addrr_sign(GEN x, long sx, GEN y, long sy)
     182              : {
     183   5334129050 :   long lx, ex = expo(x);
     184   5334129050 :   long ly, ey = expo(y), e = ey - ex;
     185              :   long i, j, lz, ez, m;
     186              :   int extend, f2;
     187              :   GEN z;
     188              :   LOCAL_OVERFLOW;
     189              : 
     190   5334129050 :   if (!sy)
     191              :   {
     192    332463989 :     if (!sx)
     193              :     {
     194    107544583 :       if (e > 0) ex = ey;
     195    107544583 :       return real_0_bit(ex);
     196              :     }
     197    224919406 :     if (e >= 0) return real_0_bit(ey);
     198    223746471 :     lz = nbits2lg(-e);
     199    223746471 :     lx = lg(x); if (lz > lx) lz = lx;
     200   1695900569 :     z = cgetg(lz, t_REAL); while(--lz) z[lz] = x[lz];
     201    223746471 :     setsigne(z,sx); return z;
     202              :   }
     203   5001665061 :   if (!sx)
     204              :   {
     205     28805606 :     if (e <= 0) return real_0_bit(ex);
     206     27202128 :     lz = nbits2lg(e);
     207     27202128 :     ly = lg(y); if (lz > ly) lz = ly;
     208    138319423 :     z = cgetg(lz, t_REAL); while (--lz) z[lz] = y[lz];
     209     27202128 :     setsigne(z,sy); return z;
     210              :   }
     211              : 
     212   4972859455 :   if (e < 0) { swap(x,y); lswap(sx,sy); ey=ex; e=-e; }
     213              :   /* now ey >= ex */
     214   4972859455 :   lx = lg(x);
     215   4972859455 :   ly = lg(y);
     216              :   /* If exponents differ, need to shift one argument, here x. If
     217              :    * extend = 1: extension of x,z by m < BIL bits (round to 1 word) */
     218              :   /* in this case, lz = lx + d + 1, otherwise lx + d */
     219   4972859455 :   extend = 0;
     220   4972859455 :   if (e)
     221              :   {
     222   4292583661 :     long d = dvmdsBIL(e, &m), l = ly-d;
     223   4292583661 :     if (l <= 2) return rcopy_sign(y, sy);
     224   4238916083 :     if (l > lx) { lz = lx + d + 1; extend = 1; }
     225   3411337137 :     else        { lz = ly; lx = l; }
     226   4238916083 :     if (m)
     227              :     { /* shift x right m bits */
     228   4229995282 :       const pari_sp av = avma;
     229   4229995282 :       const ulong sh = BITS_IN_LONG-m;
     230   4229995282 :       GEN p1 = x; x = new_chunk(lx + lz + 1);
     231   4229995275 :       shift_right(x,p1,2,lx, 0,m);
     232   4229995275 :       if (extend) uel(x,lx) = uel(p1,lx-1) << sh;
     233   4229995275 :       set_avma(av); /* HACK: cgetg(lz, t_REAL) will not overwrite x */
     234              :     }
     235              :   }
     236              :   else
     237              :   { /* d = 0 */
     238    680275794 :     m = 0;
     239    680275794 :     if (lx > ly) lx = ly;
     240    680275794 :     lz = lx;
     241              :   }
     242              : 
     243   4919191870 :   if (sx == sy)
     244              :   { /* addition */
     245   2566972530 :     i = lz-1;
     246   2566972530 :     j = lx-1;
     247   2566972530 :     if (extend) {
     248    504783287 :       ulong garde = addll(x[lx], y[i]);
     249    504783287 :       if (m < 4) /* don't extend for few correct bits */
     250     57541956 :         z = cgetg(--lz, t_REAL);
     251              :       else
     252              :       {
     253    447241331 :         z = cgetg(lz, t_REAL);
     254    447241331 :         z[i] = garde;
     255              :       }
     256              :     }
     257              :     else
     258              :     {
     259   2062189243 :       z = cgetg(lz, t_REAL);
     260   2062189243 :       z[i] = addll(x[j], y[i]); j--;
     261              :     }
     262   2566972530 :     i--;
     263  13855585586 :     for (; j>=2; i--,j--) z[i] = addllx(x[j],y[i]);
     264   2566972530 :     if (overflow)
     265              :     {
     266    606263167 :       z[1] = 1; /* stops since z[1] != 0 */
     267    607531277 :       for (;;) { z[i] = uel(y,i)+1; if (z[i--]) break; }
     268    606263167 :       if (i <= 0)
     269              :       {
     270    602224493 :         shift_right(z,z, 2,lz, 1,1);
     271    602224493 :         z[1] = evalsigne(sx) | evalexpo(ey+1); return z;
     272              :       }
     273              :     }
     274   2484572035 :     for (; i>=2; i--) z[i] = y[i];
     275   1964748037 :     z[1] = evalsigne(sx) | evalexpo(ey); return z;
     276              :   }
     277              : 
     278              :   /* subtraction */
     279   2352219340 :   if (e) f2 = 1;
     280              :   else
     281              :   {
     282    627639383 :     i = 2; while (i < lx && x[i] == y[i]) i++;
     283    384510935 :     if (i==lx) return real_0_bit(ey+1 - lg2prec(lx));
     284    359197713 :     f2 = (uel(y,i) > uel(x,i));
     285              :   }
     286              :   /* result is nonzero. f2 = (y > x) */
     287   2326906118 :   i = lz-1; z = cgetg(lz, t_REAL);
     288   2326906118 :   if (f2)
     289              :   {
     290   2169529786 :     j = lx-1;
     291   2169529786 :     if (extend) z[i] = subll(y[i], x[lx]);
     292   1846734134 :     else        z[i] = subll(y[i], x[j--]);
     293  13304061659 :     for (i--; j>=2; i--) z[i] = subllx(y[i], x[j--]);
     294   2169529786 :     if (overflow) /* stops since y[1] != 0 */
     295     67978578 :       for (;;) { z[i] = uel(y,i)-1; if (y[i--]) break; }
     296   2544574129 :     for (; i>=2; i--) z[i] = y[i];
     297   2169529786 :     sx = sy;
     298              :   }
     299              :   else
     300              :   {
     301    157376332 :     if (extend) z[i] = subll(x[lx], y[i]);
     302    157376332 :     else        z[i] = subll(x[i],  y[i]);
     303    825432207 :     for (i--; i>=2; i--) z[i] = subllx(x[i], y[i]);
     304              :   }
     305              : 
     306   2488165667 :   x = z+2; i = 0; while (!x[i]) i++;
     307   2326906118 :   lz -= i; z += i;
     308   2326906118 :   j = bfffo(z[2]); /* need to shift left by j bits to normalize mantissa */
     309   2326906118 :   ez = ey - (j | (i * BITS_IN_LONG));
     310   2326906118 :   if (extend)
     311              :   { /* z was extended by d+1 words [should be e bits = d words + m bits] */
     312              :     /* not worth keeping extra word if less than 5 significant bits in there */
     313    322795652 :     if (m - j < 5 && lz > 3)
     314    172504087 :     { /* shorten z */
     315    172504087 :       ulong last = (ulong)z[--lz]; /* cancelled word */
     316              : 
     317              :       /* if we need to shift anyway, shorten from left
     318              :        * If not, shorten from right, neutralizing last word of z */
     319    172504087 :       if (j == 0)
     320              :         /* stackdummy((pari_sp)(z + lz+1), (pari_sp)(z + lz)); */
     321     14571330 :         z[lz] = evaltyp(t_VECSMALL) | _evallg(1);
     322              :       else
     323              :       {
     324    157932757 :         GEN t = z;
     325    157932757 :         z++; shift_left(z,t,2,lz-1, last,j);
     326              :       }
     327    172504087 :       if ((last<<j) & HIGHBIT)
     328              :       { /* round up */
     329     62404584 :         i = lz-1;
     330     62866105 :         while (++((ulong*)z)[i] == 0 && i > 1) i--;
     331     62404584 :         if (i == 1) { ez++; z[2] = (long)HIGHBIT; }
     332              :       }
     333              :     }
     334    150291565 :     else if (j) shift_left(z,z,2,lz-1, 0,j);
     335              :   }
     336   2004110466 :   else if (j) shift_left(z,z,2,lz-1, 0,j);
     337   2326906118 :   z[1] = evalsigne(sx) | evalexpo(ez);
     338   2326906118 :   z[0] = evaltyp(t_REAL) | evallg(lz);
     339   2326906118 :   set_avma((pari_sp)z); return z;
     340              : }
        

Generated by: LCOV version 2.0-1