为什么在使用 char 指针 str1 而不是 str 时会出现分段转储?
Why is there a segmentation dump when using the char pointer str1 instead of str?
我使用这段代码创建了一个 Padding RSA 函数。不幸的是,在
中替换时
mpz_get_str(str, base, N.get_mpz_t());
cout<<"\n\nLength of k = Modulus in bytes: "<<strlen(str);
str 和 str1 我收到分段转储。为什么会这样?
int main(const int argc, const char *const argv[])
{
// Check number of arguments
if (argc!=4){
printf("usage: %s [Message] [Exponent] [Modulus] \n", argv[0]);
return 1;
}
char *str;
char *str1="";
int base=10,l;
mpz_t op;
// Receive arguments
const mpz_class m(argv[1]), d(argv[2]),N(argv[3]),message(argv[1]);
mpz_get_str(str1, base, N.get_mpz_t());
cout<<"\n\nLength of k = Modulus in bytes: "<<strlen(str1);
// Calculate RSA
cout<<endl<<RSA(m,d,N);
//TestArea
cout<<"\n\n"<<m;
mpz_get_str(str, base, m.get_mpz_t());
cout<<"\n\nLength of string message in bytes: "<<strlen(str);
cout<<"\n\n"<<str;
return 0;
}
If str is NULL, the result string is allocated using the current allocation function (see Custom Allocation). The block will be strlen(str)+1 bytes, that being exactly enough for the string and null-terminator.
If str is not NULL, it should point to a block of storage large enough for the result, that being mpz_sizeinbase (op, base) + 2. The two extra bytes are for a possible minus sign, and the null-terminator.
来自https://gmplib.org/manual/Converting-Integers.html
当您将 str1
传递给 mpz_get_str
时,因为它不是 NULL
并且此函数期望 str1
指向具有足够 space 的缓冲区结果,当 mpz_get_str
试图将数据移动到 str1
.
指向的假定缓冲区时,将发生段错误
可能的解决方案是:
vector<char> str1(mpz_sizeinbase (N.get_mpz_t(), base) + 2);
mpz_get_str(str1.data(), base, N.get_mpz_t());
有两个错误(至少)。您已将字符串文字传递给 mpz_get_str.
char *str1="";
mpz_get_str(str1, base, N.get_mpz_t());
字符串文字不可修改。
其次,即使字符串文字是可修改的,您也没有分配足够的内存来保存您的号码。
第三个错误是概念性的。看来你想知道N
占用的字节数,这段代码,即使运行,也不会告诉你。
这里是判断N
占用字节数的代码
size_t num_bytes = mpz_size(N.get_mpz_t())*sizeof(mp_limb_t);
num_bytes
将是 GMP 内部用来存储数字大小的字节数 N
。
我使用这段代码创建了一个 Padding RSA 函数。不幸的是,在
中替换时mpz_get_str(str, base, N.get_mpz_t());
cout<<"\n\nLength of k = Modulus in bytes: "<<strlen(str);
str 和 str1 我收到分段转储。为什么会这样?
int main(const int argc, const char *const argv[])
{
// Check number of arguments
if (argc!=4){
printf("usage: %s [Message] [Exponent] [Modulus] \n", argv[0]);
return 1;
}
char *str;
char *str1="";
int base=10,l;
mpz_t op;
// Receive arguments
const mpz_class m(argv[1]), d(argv[2]),N(argv[3]),message(argv[1]);
mpz_get_str(str1, base, N.get_mpz_t());
cout<<"\n\nLength of k = Modulus in bytes: "<<strlen(str1);
// Calculate RSA
cout<<endl<<RSA(m,d,N);
//TestArea
cout<<"\n\n"<<m;
mpz_get_str(str, base, m.get_mpz_t());
cout<<"\n\nLength of string message in bytes: "<<strlen(str);
cout<<"\n\n"<<str;
return 0;
}
If str is NULL, the result string is allocated using the current allocation function (see Custom Allocation). The block will be strlen(str)+1 bytes, that being exactly enough for the string and null-terminator.
If str is not NULL, it should point to a block of storage large enough for the result, that being mpz_sizeinbase (op, base) + 2. The two extra bytes are for a possible minus sign, and the null-terminator.
来自https://gmplib.org/manual/Converting-Integers.html
当您将 str1
传递给 mpz_get_str
时,因为它不是 NULL
并且此函数期望 str1
指向具有足够 space 的缓冲区结果,当 mpz_get_str
试图将数据移动到 str1
.
可能的解决方案是:
vector<char> str1(mpz_sizeinbase (N.get_mpz_t(), base) + 2);
mpz_get_str(str1.data(), base, N.get_mpz_t());
有两个错误(至少)。您已将字符串文字传递给 mpz_get_str.
char *str1="";
mpz_get_str(str1, base, N.get_mpz_t());
字符串文字不可修改。
其次,即使字符串文字是可修改的,您也没有分配足够的内存来保存您的号码。
第三个错误是概念性的。看来你想知道N
占用的字节数,这段代码,即使运行,也不会告诉你。
这里是判断N
size_t num_bytes = mpz_size(N.get_mpz_t())*sizeof(mp_limb_t);
num_bytes
将是 GMP 内部用来存储数字大小的字节数 N
。