Nikos Mavrogiannopoulos <n...@redhat.com> writes:

> It seems
> that static analyzer in F28 finds few issues:
> https://gitlab.com/gnutls/nettle/-/jobs/81332560 (click on browse for
> artifacts)
>
> They are mem leaks on examples and one which relates to gmp-mini.

I fixed the leaks. Remaining issues listed on
https://gnutls.gitlab.io/-/nettle/-/jobs/81425078/artifacts/scan-build-lib/2018-07-12-205643-1877-1/index.html
(but will disappear in a few days; should we increase the expire_in
parameter in .gitlab-cy.yml?)..

I've had a closer look now, and I think both are of similar type. In
eratosthenes.c, we have a bitmap initialized with

  static void
  vector_init(unsigned long *vector, unsigned long size)
  {
    unsigned long end = (size + BITS_PER_LONG - 1) / BITS_PER_LONG;
    unsigned long i;
  
    for (i = 0; i < end; i++)
      vector[i] = ~0UL;
  }

and later updated with the loop

  static void
  vector_clear_bits (unsigned long *vector, unsigned long step,
                     unsigned long start, unsigned long size)
  {
    unsigned long bit;
  
    for (bit = start; bit < size; bit += step)
      {
        unsigned long i = bit / BITS_PER_LONG;
        unsigned long mask = 1L << (bit % BITS_PER_LONG);
  
        vector[i] &= ~mask;
      }
  }

The value of the size argument is the same in both places (named
"sieve_nbits" in the calling code). The static analyzer complains that
vector[i] is not properly initialized. And it's kind-of right: In case
(size + BITS_PER_LONG - 1) wraps around, the bitmap will not be
initialized properly. But I would classify it as an out-of-bounds
access, not use of uninitialized data.

I could add an overflow check in the vector_alloc function, which uses
the same expression, and where it might make sense. I wonder of that
would make the analyzer happy.

In eccdata.c, the allocation function is ecc_alloc, which alllocates an
array and loops over it to initialize all elements. The complant is in
ecc_pippenger_precompute, which allocates an array with

  ecc->table = ecc_alloc (ecc->table_size);

and the complaint is the assignment of element 1,

  ecc_set (&ecc->table[1], &ecc->g);

where ecc->table[1].x->_mp_alloc is claimed to be uninitialized.

This also is kind-of right; if the program is run with strange
parameters, we might get ecc->table_size < 2 (and again, in that case,
it's an out of bounds access).

I don't have that much experience with the static analyzer. Should I
just add error handling for the corner cases, and see if that solves the
problem?

Regards,
/Niels

-- 
Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.
_______________________________________________
nettle-bugs mailing list
nettle-bugs@lists.lysator.liu.se
http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs

Reply via email to