首页 > 解决方案 > 带有 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]);
...

并且没有错误

为什么会这样?我怎样才能改变它?

提前致谢

标签: c

解决方案


我可以发现以下(潜在的)问题。


我可以在我的 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未初始化。


推荐阅读