| 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