我在主线程中有一个__stack_chk_fail。 我不知道为什么会这样?
我从这个网站获得了代码:
http://www.packetizer.com/security/sha1/
我试图使用示例添加一个函数来计算文件的摘要。
.h文件
#include <stdio.h>
#include <string>
std::string digestFile( char *filename );
.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;
}
答案 0 :(得分:3)
__stack_chk_fail
。
事实证明你做到了:
char buffer[8];
int count = sprintf(buffer, "%08x", message_digest[i]);
C字符串以NUL终止。这意味着当sprintf
写入8位数时,它会添加第9个 char
,'\0'
。但是buffer
只有8 char
s的空间,所以第9个超过了缓冲区的末尾。
您需要char buffer[9]
。或者使用std::stringstream
的C ++方式,它不涉及任何固定大小,因此没有缓冲区溢出的风险。