Can you confirm what config.guess says on your system.

It's relevant because on some systems I believe SSE instructions are
used to copy data 128 bits at a time. Valgrind gets confused, even
though this is valid on all systems for which the trick is employed.

Jason Moxham should be able to confirm whether your system is one of
these if you tell us the output of config.guess.

Bill.

On 10 July 2012 22:26, NigelSmart <nigel.paul.sm...@gmail.com> wrote:
> Hi
>
> Just installed MPIR and am playing with it, and my program crashed
> for some unknown reason.
>
> So I did a valgrind and found on a relatively simple program I get
> an invalid memory read. Given that this is likely to result from my
> misunderstanding of something. I am posting here so someone
> can help me out (either my install is wrong, or my application is wrong)....
>
> OK. Here is some code which reproduces the bug (its for a mod square
> root algorithm)....
>    - The typedef of mpz_class to bigint is because I am comparing this
>      MPIR implementation against the same one with another bignum class
>      provider
>
>
> #include <mpirxx.h>
>
> #include <iostream>
> using namespace std;
>
> typedef mpz_class bigint;
>
> bigint sqrRootMod(const bigint& a,const bigint& p)
> {
>   bigint ans;
>   if (a==0) { ans=0; return ans; }
>     if (mpz_tstbit(p.get_mpz_t(),1)==1)
>       { // First do case with p=3 mod 4
>         bigint exp=(p+1)/4;
>         mpz_powm(ans.get_mpz_t(),a.get_mpz_t(),exp.get_mpz_t(),p.get_mpz_t());
>       }
>     else
>       { // Shanks algorithm
>         gmp_randclass Gen(gmp_randinit_default);
>         Gen.seed(0);
>         bigint x,y,n,q,t,b,temp;
>         // Find n such that (n/p)=-1
>         int leg=1;
>         while (leg!=-1)
>           { n=Gen.get_z_range(p);
>             leg=mpz_legendre(n.get_mpz_t(),p.get_mpz_t());
>           }
>         // Split p-1 = 2^e q
>         q=p-1;
>         int e=0;
>         while (mpz_even_p(q.get_mpz_t()))
>           { e++; q=q/2; }
>         // y=n^q mod p, x=a^((q-1)/2) mod p, r=e
>         int r=e;
>         mpz_powm(y.get_mpz_t(),n.get_mpz_t(),q.get_mpz_t(),p.get_mpz_t());
>         temp=(q-1)/2;
>         mpz_powm(x.get_mpz_t(),a.get_mpz_t(),temp.get_mpz_t(),p.get_mpz_t());
>         // b=a*x^2 mod p, x=a*x mod p
>         b=(a*x*x)%p;
>         x=(a*x)%p;
>         // While b!=1 do
>         while (b!=1)
>           { // Find smallest m such that b^(2^m)=1 mod p
>             int m=1;
>             temp=(b*b)%p;
>             while (temp!=1)
>               { temp=(temp*temp)%p; m++; }
>             // t=y^(2^(r-m-1)) mod p, y=t^2, r=m
>             t=y;
>             for (int i=0; i<r-m-1; i++)
>               { t=(t*t)%p; }
>             y=(t*t)%p;
>             r=m;
>             // x=x*t mod p, b=b*y mod p
>             x=(x*t)%p;
>             b=(b*y)%p;
>           }
>         ans=x;
>       }
>   return ans;
> }
>
>
> int main()
> {
>
>   mpz_class a,b,p;
>   b=3; p=17;
>
>   a=(b*b)%p;
>   b=sqrRootMod(a,p);
>   cout << b << endl;
> }
>
>
>
> Now on compiling this (g++ -g blah.cpp -lmpirxx -lmpir) and then doing
> valgrind I get...
>
> mpir% valgrind --leak-check=yes a.out
> ==7827== Memcheck, a memory error detector
> ==7827== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
> ==7827== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
> ==7827== Command: a.out
> ==7827==
> ==7827== Invalid read of size 8
> ==7827==    at 0x4E6C1AD: __gmpn_copyi (in 
> /home/crypto/linux.x86_64/mpir-2.5.1/lib/libmpir.so.7.4.2)
> ==7827==    by 0x40138A: sqrRootMod(__gmp_expr<__mpz_struct [1], __mpz_struct 
> [1]> const&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]> const&) 
> (test.cpp:35)
> ==7827==    by 0x401D30: main (test.cpp:71)
> ==7827==  Address 0x50e40d8 is 0 bytes after a block of size 8 alloc'd
> ==7827==    at 0x4A0515D: malloc (vg_replace_malloc.c:195)
> ==7827==    by 0x4E1B078: __gmp_default_allocate (in 
> /home/crypto/linux.x86_64/mpir-2.5.1/lib/libmpir.so.7.4.2)
> ==7827==    by 0x4E2A8D7: __gmpz_init (in 
> /home/crypto/linux.x86_64/mpir-2.5.1/lib/libmpir.so.7.4.2)
> ==7827==    by 0x402065: __gmp_expr<__mpz_struct [1], __mpz_struct 
> [1]>::__gmp_expr() (mpirxx.h:1546)
> ==7827==    by 0x401136: sqrRootMod(__gmp_expr<__mpz_struct [1], __mpz_struct 
> [1]> const&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]> const&) 
> (test.cpp:21)
> ==7827==    by 0x401D30: main (test.cpp:71)
> ==7827==
> 14
> ==7827==
> ==7827== HEAP SUMMARY:
> ==7827==     in use at exit: 0 bytes in 0 blocks
> ==7827==   total heap usage: 51 allocs, 51 frees, 23,898 bytes allocated
> ==7827==
> ==7827== All heap blocks were freed -- no leaks are possible
> ==7827==
> ==7827== For counts of detected and suppressed errors, rerun with: -v
> ==7827== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6)
>
>
> --
> You received this message because you are subscribed to the Google Groups 
> "mpir-devel" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/mpir-devel/-/Kr_PtO4mPrIJ.
> To post to this group, send email to mpir-devel@googlegroups.com.
> To unsubscribe from this group, send email to 
> mpir-devel+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/mpir-devel?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"mpir-devel" group.
To post to this group, send email to mpir-devel@googlegroups.com.
To unsubscribe from this group, send email to 
mpir-devel+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/mpir-devel?hl=en.

Reply via email to