C语言 为 SHA1 摘要数组分配内存



我有一个小程序,它为通过命令行传递的参数生成 SHA1 摘要,并将它们存储在指向 char 数组的指针数组中(我认为(:

#include <stdio.h>
#include <openssl/sha.h>
int entries = 0; // Keep track of entries added
int main(int argc, char **argv)
{
    // Allocate space for the digest array
    unsigned char **mds = malloc(1);
    // Add entries to the digest, one for each argument passed  
    for(int k = 1; k < argc; k++) {
        mds[k - 1] = malloc(SHA_DIGEST_LENGTH);
        SHA1(argv[k], strlen(argv[k]), mds[k - 1]);
        entries++;
    }
    // Print each 20-byte digest
    for(int j = 0; j < entries; j++) {
        for(int i = 0; i < SHA_DIGEST_LENGTH; i++) { printf("%02x ", *(mds[j] + i)); }
        printf("n");
    }
}

最初我有unsigned char **mds = calloc(argc, SHA_DIGEST_LENGTH);,每次我想添加另一个条目时,我都会尝试使用realloc()(如果我不知道以后会有多少条目(。

但后来我发现我不需要这样做,我甚至根本不需要分配任何空间?只是一个字节,它仍然可以正常工作。这对我来说似乎不对。

我只是运气好还是什么?我错过了什么?

我只是运气好还是什么?

是的。

我错过了什么?

程序在分配的内存之外写入。 这样做会导致未定义的行为。 任何事情都可能发生,包括出现正确的行为。

添加一些free()调用可能会出现一些崩溃程序,但不能保证 - 毕竟未定义的行为是未定义的。

您正在写入未分配给您的内存。幸运的是,到目前为止您没有崩溃。

尝试使用valgrind,如果它在您的平台上可用。它会告诉您有关这种种类的内存错误以及何时分配忘记释放的内存。 该程序的运行速度会变慢,但您只需要出于测试目的进行操作。

这部分:

// Allocate space for the digest array
unsigned char **mds = malloc(1);

分配大小为 1 字节的内存块,并将其地址强制转换为 unsigned char** 。然后在第一次迭代的稍后,当您这样做时:

mds[k - 1] = malloc(SHA_DIGEST_LENGTH);

malloc返回一个地址,该地址被写入无效内存中,导致未定义的行为


您需要分配适当的内存块来保存指针,

并且在每次迭代中,您将初始化这些指针中的每一个,以指向将保存字符串的内存块:

// allocate array of pointers:
unsigned char **mds = malloc( (argc - 1) * sizeof(unsigned char*) );
for (int k = 1; k < argc; k++) {
    mds[k - 1] = malloc(SHA_DIGEST_LENGTH);
    SHA1(argv[k], strlen(argv[k]), mds[k - 1]);
    entries++;
}
...
// cleaning up:
for (int k = 1; k < argc; k++) {
    free(mds[k - 1]);
}
free(mds);

相关内容

  • 没有找到相关文章

最新更新