2014-03-06 2 views
1

Visual Studio 2012에서 작업하고 있습니다. 그러나 디버그 모드에서는 프로그램이 올바르게 작동하지만 릴리스 모드로 변경하면 프로그램은 내가 그들의 다운로드 페이지에서 PBC의 MS VC++ Convertion를 사용하고있어 PBC 기능 element_pow_zn()PBC (기반 암호화 기반 라이브러리) element_to_mpz()에 대한 호출시 힙 손상

에 의해 호출됩니다 element_to_mpz().

_realloc()에 대한 호출에서 호출 스택이 오류를 나타내는 것으로 보입니다. 나는 책임이있는 선을 찾았다 고 생각한다. 인민 은행 소스에서, montfp.c의 133 행합니다 (_mpz_realloc() 호출)

static void fp_to_mpz(mpz_ptr z, element_ptr e) { 
    eptr ep = e->data; 
    if (!ep->flag) mpz_set_ui(z, 0); 
    else { 
    // x is stored as xR. 
    // We must divide out R to convert to standard representation. 
    fptr p = e->field->data; 
    mp_limb_t tmp[2 * p->limbs]; 

    memcpy(tmp, ep->d, p->limbs * sizeof(mp_limb_t)); 
    memset(&tmp[p->limbs], 0, p->limbs * sizeof(mp_limb_t)); 

    /************************************************************************** 
    * The line I believe to be failing - However I can't step into PBC.dll as 
    * I do not have the symbols. 
    **************************************************************************/ 
    _mpz_realloc(z, p->limbs);//This is a call into the GMP library 

    mont_reduce(z->_mp_d, tmp, p); 
    // Remove leading zero limbs. 
    for (z->_mp_size = p->limbs; !z->_mp_d[z->_mp_size - 1]; z->_mp_size--); 
    } 
} 

코드 실제로 (element_to_mpz 전화를 사용하고 있습니다)은 다음과 같습니다

bswabe_cph_t* 
bswabe_enc(bswabe_pub_t* pub, element_t m, char* policy) 
{ 
    bswabe_cph_t* cph; 
    element_t s; 

    cph = (bswabe_cph_t*)malloc(sizeof(bswabe_cph_t)); 

    element_init_Zr(s, pub->p); 
    element_init_GT(m, pub->p); 
    element_init_GT(cph->cs, pub->p); 
    element_init_G1(cph->c, pub->p); 
    cph->p = parse_policy_postfix(policy); 

    element_random(m); 
    element_random(s); 

    /**************************************************** 
    * The call to element_to_mpz() is in element_pow_zn() 
    *****************************************************/ 
    element_pow_zn(cph->cs, pub->g_hat_alpha, s); 

    element_mul(cph->cs, cph->cs, m); 

    element_pow_zn(cph->c, pub->h, s); 

    fill_policy(cph->p, pub, s); 

    return cph; 
} 

위의 코드는 CPABE에 있습니다 - 어떤 정책 기반 암호화를위한 라이브러리입니다. 인수 pub, m정책은 모두 호출 환경에서 올바르게 초기화됩니다.

이것이 CPABE 코드, PBC, 코드 또는 GMP의 버그인지 여부는 확실하지 않습니다. (그 이후로 _mpz_realloc()이 정의 됨)

모든 도움을 주시면 감사하겠습니다.

답변

1

이 문제를 해결하기 위해 GMP 요구 사항을 MPIR으로 바꿨습니다. VS2012로 구축 할 수 있으며 GMP의 드롭 인 대체품으로 사용할 수 있습니다. 이 라이브러리로 전환 한 후 문제가 해결되었습니다.

내 문제의 원인은 GMP-4.1의 버그였습니다. 또한 GMP-5.1을 컴파일하고 VC++로 작업 할 수 없기 때문에 버그가 실제로 GMP에서 사라진 것을 결코 확인할 수 없었습니다.