C++ sha-1 c和x2B中的堆栈检查失败+;

C++ sha-1 c和x2B中的堆栈检查失败+;,c++,sha1,C++,Sha1,我在主线程中遇到了一个堆栈失败。 我不知道为什么会这样 我从这个网站上得到了代码: 我试图添加一个函数来计算一个文件的摘要 .h文件 #include <stdio.h> #include <string> std::string digestFile( char *filename ); #包括 #包括 std::字符串摘要文件(char*文件名); .cpp文件 std::string SHA1::digestFile( char *filename ) {

我在主线程中遇到了一个堆栈失败。 我不知道为什么会这样

我从这个网站上得到了代码:
我试图添加一个函数来计算一个文件的摘要

.h文件

#include <stdio.h>
#include <string>
std::string digestFile( char *filename );
#包括
#包括
std::字符串摘要文件(char*文件名);
.cpp文件

std::string SHA1::digestFile( char *filename )
{
    Reset();

    FILE *fp = NULL;
    if (!(fp = fopen(filename, "rb")))
    {
        printf("sha: unable to open file %s\n", filename);
        return NULL;
    }

    char c = fgetc(fp);
    while(!feof(fp))
    {
        Input(c);
        c = fgetc(fp);
    }

    fclose(fp);

    unsigned message_digest[5];
    if (!Result(message_digest))
    { printf("sha: could not compute message digest for %s\n", filename); }

    std::string hash;
    for (int i = 0; i < 5; i++)
    {
        char buffer[8];
        int count = sprintf(buffer, "%08x", message_digest[i]);
        if (count != 8)
        { printf("converting unsiged to char ERROR"); }

        hash.append(buffer);
    }

    return hash;
}
std::string SHA1::digestFile(char*filename)
{
重置();
FILE*fp=NULL;
如果(!(fp=fopen(文件名,“rb”))
{
printf(“sha:无法打开文件%s\n”,文件名);
返回NULL;
}
char c=fgetc(fp);
而(!feof(fp))
{
投入(c);
c=fgetc(fp);
}
fclose(fp);
未签名消息摘要[5];
如果(!结果(消息摘要))
{printf(“sha:无法计算%s的消息摘要,\n”,文件名);}
std::字符串散列;
对于(int i=0;i<5;i++)
{
字符缓冲区[8];
int count=sprintf(缓冲区,“%08x”,消息摘要[i]);
如果(计数!=8)
{printf(“将非原始数据转换为字符错误”);}
hash.append(缓冲区);
}
返回散列;
}

\u堆栈\u chk\u失败
在写入无效地址时发生

事实证明你做到了:

    char buffer[8];
    int count = sprintf(buffer, "%08x", message_digest[i]);
C字符串以NUL结尾。这意味着当
sprintf
写入8位数字时,它会添加第9个
char
'\0'
。但是
buffer
只有8个
char
s的空间,所以第9个经过了缓冲区的末尾


您需要
字符缓冲区[9]
。或者用C++方式,用<代码> STD::StrugStule,它不涉及任何固定大小,因此没有缓冲区溢出的风险。

<代码>代码> StaskSkkfIs><代码>当您写入无效地址时,

事实证明你做到了:

    char buffer[8];
    int count = sprintf(buffer, "%08x", message_digest[i]);
C字符串以NUL结尾。这意味着当
sprintf
写入8位数字时,它会添加第9个
char
'\0'
。但是
buffer
只有8个
char
s的空间,所以第9个经过了缓冲区的末尾


您需要
字符缓冲区[9]
。或者用C++方式,用<代码> STD::StrugStule,它不涉及任何固定大小,因此没有缓冲区溢出的风险。

<代码>代码> StaskSkkfIs><代码>当您写入无效地址时,

事实证明你做到了:

    char buffer[8];
    int count = sprintf(buffer, "%08x", message_digest[i]);
C字符串以NUL结尾。这意味着当
sprintf
写入8位数字时,它会添加第9个
char
'\0'
。但是
buffer
只有8个
char
s的空间,所以第9个经过了缓冲区的末尾


您需要
字符缓冲区[9]
。或者用C++方式,用<代码> STD::StrugStule,它不涉及任何固定大小,因此没有缓冲区溢出的风险。

<代码>代码> StaskSkkfIs><代码>当您写入无效地址时,

事实证明你做到了:

    char buffer[8];
    int count = sprintf(buffer, "%08x", message_digest[i]);
C字符串以NUL结尾。这意味着当
sprintf
写入8位数字时,它会添加第9个
char
'\0'
。但是
buffer
只有8个
char
s的空间,所以第9个经过了缓冲区的末尾


您需要
字符缓冲区[9]
。或者C++的方式,用<代码> STD::StrugStule,它不涉及任何固定大小,因此没有缓冲区溢出的风险。

我不知道为什么我的问题被否决了。因为这是一个愚蠢的问题或者我问错了?我不知道为什么我的问题被否决了。因为这是一个愚蠢的问题或者我问错了?我不知道为什么我的问题被否决了。因为这是一个愚蠢的问题或者我问错了?我不知道为什么我的问题被否决了。因为这是个愚蠢的问题还是我问错了?