Ilya Zakharevich on Sun, 17 Sep 2000 15:57:47 -0400


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Math::Pari segfaults?


On Sat, Sep 16, 2000 at 11:32:02PM -0700, Vipul Ved Prakash wrote:
> Greetings Ilya!
> 
> You might recall that I was bugging you last year around the same time about
> a Math::Pari bug.  Well, recently I resurrected Crypt::Primes which uses
> Math::Pari to generate large, random prime numbers.  Sometimes, while
> generating 1024-bit primes, the module segfaults.  Here's a core-file
> backtrace:

This summer I have been debugging a similar problem.  My conclusion was:
this is the problem sitting deeply in PARI semantic.  Maybe your
problem is the same.

PARI's Mod(a,b) may reference the b modulus in several ways, one of
them being that the object for Mod(a,b) just keeps the pointer to b.
*Without increasing the refcount of b* (there is no notion of refcount
in PARI!).  The logic of Math::Pari is such that you cannot control
whether this way of storing the modulus is used.

Corollary for Math::Pari: if you use $c = Mod($a,$b), $b should live
strictly longer than $b.  Given to a bug/misfeature of Perl, it is not
enough to have

 {
  my $b = Blah();
  my $c = Mod($a,$b);
  ...
 }

or even

 {
  my $b = Blah();
  {
   my $c = Mod($a,$b);
   ...
  }
 }

You need an intervening statement between the ends of two blocks:

 {
  my $b = Blah();
  {
   my $c = Mod($a,$b);
   ...
  }
  $fake++;			# Allow $c to be destructed before $a
 }

Another solution is to have $b in a file-scope variable, and $c in a
subroutine-scope variable.

Hope this helps,
Ilya