0

当我在终端上运行以下代码时,它会给出分段错误。我正在使用boringssl 库。

#include <bits/stdc++.h>
#include <openssl/evp.h>
using namespace std;

// #include <openssl/digest.h>
int main(){
    EVP_MD_CTX* ctx = EVP_MD_CTX_new();
    EVP_MD_CTX_init(ctx);

    const EVP_MD* sha256 = EVP_sha256();
    EVP_DigestInit(ctx,sha256);

    char str[]="ANIKET GUPTA";
    EVP_DigestUpdate(ctx,str,strlen(str));

    unsigned char hash[EVP_MAX_MD_SIZE];
    unsigned int* hash_size;
    EVP_DigestFinal(ctx,hash,hash_size);

    cout <<"SUCCESS";
    EVP_MD_CTX_free(ctx);
}

我使用以下命令运行此代码: g++ -I~/src/boringssl/include sign.cpp ~/src/boringssl/build/crypto/libcrypto.a -lpthread 导致分段错误的错误是什么?

4

2 回答 2

0

解决了!我们必须 malloc hash 和 hash_size

于 2018-12-06T15:26:19.103 回答
0

在行中

unsigned int* hash_size;
EVP_DigestFinal(ctx, hash, hash_size);

您在hash_size未初始化时使用它,并且EVP_DigestFinal()会尝试将hash_size结果写入未知位置,从而导致段错误。相反,你可以做

unsigned int hash_size;
EVP_DigestFinal(ctx, hash, &hash_size);

你的编译器应该已经给你这个问题的指示,它通常能够检测到像这样的未初始化变量。

于 2018-12-06T15:22:23.383 回答