c - 带有 char* 的 C 中的内存访问错误问题
问题描述
我可以在我的 Linux Mint 系统上在其他 Linux 系统上运行 ac programm 而不会出现问题,但出现内存访问错误。
void digest_message(const unsigned char *message, size_t message_len, unsigned char **digest, unsigned int *digest_len)
{
EVP_MD_CTX *mdctx;
if((mdctx = EVP_MD_CTX_create()) == NULL)
handleErrors();
if(1 != EVP_DigestInit_ex(mdctx, EVP_sha1(), NULL))
handleErrors();
if(1 != EVP_DigestUpdate(mdctx, message, message_len))
handleErrors();
if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha1()))) == NULL)
handleErrors();
if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
handleErrors();
EVP_MD_CTX_destroy(mdctx);
}
void main ()
{
...
const unsigned char *message= (const unsigned char*) decryptedtext;
size_t mlen=x;
unsigned char *digest;
unsigned int dlen;
digest_message(message,mlen,&digest,&dlen);
// if i printf in a for loop i get this memmory access error
for(int i=0;i<dlen;i++)
printf("%x ",digest[i]);
}
我试过了:
printf("%x ",digest[0]);
printf("%x ",digest[1]);
printf("%x ",digest[2]);
...
并且没有错误
为什么会这样?我怎样才能改变它?
提前致谢
解决方案
我可以发现以下(潜在的)问题。
我可以在我的 Linux Mint 上毫无问题地运行 ac 程序
我认为这只是一个快乐的巧合,你没有看到问题。
const unsigned char *message= (const unsigned char*) decryptedtext;
如果decryptedtext
只是一个指针,那么进一步使用它message
是一个非常糟糕的主意。通常,您应该分配内存以便访问它。
size_t mlen=x;
理想情况下,mlen
应该与 的长度有关message
。如果mlen
大于 的实际长度message
,则有麻烦(缓冲区溢出,内存损坏......)。
unsigned int dlen;
你如何确保它dlen
不大于可用的条目数digest
?
printf("%x ",digest[i]);
为什么要将printf
字符串(digest
)作为十六进制数?
---------------------
if(decryptedtext[0]==0x25 && //%
decryptedtext[1]==0x50 && //P
decryptedtext[2]==0x44 && //D
decryptedtext[3]==0x46) //F
{ printf("%s",decryptedtext);
break;
}
这很丑陋。decryptedtext
不是以 null 结尾的字符串,因此printf()
不会仅打印 4 个字符。
int x;
f = fopen("test.pdf", "w+b");
if(f == NULL) {
printf("Datei konnte nicht geoeffnet werden.\n");
}else {
while(x<decryptedtext_len) {
putc(decryptedtext[x],f);
x++;
}
x
在使用前未初始化。
unsigned char hasharrayone[20];
unsigned char hasharraytwo[20];
unsigned char hasharraythree[20];
你可以使用:
unsigned char hasharray[3][20];
int xc;
file = fopen("sxxxxx-dest-cipher.bin", "w+b");
if(file == NULL) {
printf("Datei konnte nicht geoeffnet werden.\n");
}else {
while(xc<cpl) {
putc(cfbciphertext[xc],file);
xc++;
}
xc
未初始化。
推荐阅读
- android - 如何在不重定向到 okta 网站进行身份验证的情况下登录 okta?
- c - C中的可变长度参数
- c++ - C++ 一次迭代所有泛型
- asp.net - 允许用户调整gridview列的大小
- r - 使用 MathJax 在闪亮的应用程序中内联 LaTeX 方程
- jquery-mobile - jquery mobile - 删除标题中的图标光盘
- python - 还有什么可以移动到我的 .config 目录?
- java - 对主题和教师进行分组并提高代码性能
- javascript - 从对象 javascript 中获取密钥
- c# - 如何将双引号作为参数从 C# 传递给 python 脚本?