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,它不涉及任何固定大小,因此没有缓冲区溢出的风险。我不知道为什么我的问题被否决了。因为这是一个愚蠢的问题或者我问错了?我不知道为什么我的问题被否决了。因为这是一个愚蠢的问题或者我问错了?我不知道为什么我的问题被否决了。因为这是一个愚蠢的问题或者我问错了?我不知道为什么我的问题被否决了。因为这是个愚蠢的问题还是我问错了?