我正在尝试通过搜索md5哈希文件并使用bsearch在某个数据库中找到它们来制作破解密码的程序。我的问题是我遇到了由我的qsort或我的printf引起的分段错误(我运行Valgrind并且它说printf,但是操纵qsort会改变错误输出)。我似乎无法在线找到解决方案,虽然我已经尝试刷新stdout以及在qsort函数中调整数组大小的不同方法。
char **dict = read_dict( argv[2] );
read_dict,我没有放在这里,因为它是一大堆代码,它接收字典文件,将其拆分为字符串数组,将其格式化为hash:password,并为其设置mallocs空间。然后它返回包含每个字符串的指针数组的指针。
int qcompare( const void *a, const void *b)
{
return strncmp( *((char **)a), *((char **)b), HASH_LEN);
}
qsort(dict, (sizeof(dict) / sizeof(dict[0])), sizeof(char *), qcompare);
for (int i = 0; dict[i] != NULL; i++)
{
printf("%s\n", dict[i]);
}
这里显示的printf不是我正在使用的那个,它只是我试图用来调试代码的一个更简单的。这是我第一次发帖,所以希望我没有做任何格式化这个问题的错误。提前感谢您提供的任何帮助。
按要求阅读read_dict
char **read_dict(char *filename)
{
FILE *f = fopen(filename, "r");
if (!f)
{
printf("read_dict: file error message\n");
exit(1);
}
int arrlen = 0;
int i = 0;
char **dict = NULL;
char buf[PASS_LEN];
while (fgets(buf, PASS_LEN, f) != NULL)
{
if (i == arrlen)
{
arrlen += STEPSIZE;
char **newdict = realloc(dict, arrlen * sizeof(char*));
if (!newdict)
{
printf("read_dict: newdict error message\n");
exit(1);
}
dict = newdict;
}// end of if
buf[strlen(buf) - 1] = '\0';
int slen = strlen(buf);
char *pass = malloc( (slen + 1) * sizeof(char));
strcpy(pass, buf);
char output[(HASH_LEN + PASS_LEN + 1)];
sprintf(output, "%s:%s", md5(pass, strlen(pass)), pass );
dict[i] = output;
i++;
}// end of while
if (i == arrlen)
{
char **newarr = realloc(dict, (arrlen + 1) * sizeof(char*));
if (!newarr)
{
printf("read_dict: newarr error message\n");
exit(1);
}
dict = newarr;
}
dict[i] = NULL;
return dict;
}// end of read_dict