带char *的C中的内存访问错误问题

时间:2019-06-26 08:38:59

标签: c

我可以在其他Linux系统上的Linux Mint系统上运行c程序,而不会出现内存访问错误。

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]);
...

没有错误

为什么会这样?我该如何更改?

预先感谢

2 个答案:

答案 0 :(得分:-1)

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


  

我可以在Linux Mint上运行c程序而没有问题

我认为这只是一个快乐的巧合,您没有看到这些问题。


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不是以空值结尾的字符串,因此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未初始化。

答案 1 :(得分:-1)

您使用printf("%x ", digest[i])有未定义的行为。

this answer中所述,使用错误的格式说明符会导致未定义的行为。这可能是程序行为取决于运行的操作系统(它也可能取决于硬件和编译器)的原因。

由于我没有收到错误消息,所以很难知道您遇到的情况,但是由于“%x”格式说明符通常与unsigned int一起使用,因此它应该读取4字节的内存。由于disgest[i]unsigned char,因此它仅以1字节写入,这可能就是为什么出现内存访问错误的原因。

在使用unsigned char之前将digest[i]变量unsigned int转换为printf应该可以解决您的问题。

此外,this topic应该可以帮助您打印十六进制字符