CS50x 恢复适用于 debug50,但在使用 check50 进行测试时超时
CS50x recover works with debug50 but times out when testing with check50
我目前正在研究 CS50x 恢复问题集 4,我已经完成了编码,并且在使用 debug50 时可以正常工作,但在使用 check50 时它可以正常工作 returns this:
:) recover.c 存在。
:) recover.c 编译。
:) 处理缺少取证图像
:( 正确恢复 000.jpg
等待程序退出时超时
:( 正确恢复中间图像
等待程序退出时超时
:( 正确恢复 049.jpg
等待程序退出时超时
都超时了。
而且我也在控制台中看到了这一点,因为当我 运行 它似乎卡在开头时。
这是我的代码:
#include <stdlib.h>
int main(int argc, char *argv[])
{
//check for wrong syntax
if (argc != 2)
{
printf("Usage: ./recover image\n");
return 1;
}
//open card
FILE *file = fopen(argv[1], "r");
//check if file exists
if (file != NULL)
{
//vars
unsigned char buffer[512];
int files = 0;
FILE *jpg;
//read file until end
while (fread(buffer, 512, 1, file) == 1)
{
//check for jpg beginning
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
{
//vars
char jpgname[8];
//generate name
sprintf(jpgname, "%03i.jpg", files);
//do only if jpg exists
if (jpg != NULL)
{
fclose(jpg);
}
//create new file with generated name
jpg = fopen(jpgname, "w");
//increment file counter
files++;
}
//only do when jpg exists
if (jpg != NULL)
{
//write data to file
fwrite(buffer, 512, 1, jpg);
}
}
if (jpg != NULL)
{
//close final jpg
fclose(jpg);
}
//close file finally
fclose(file);
}
else
{
//when file not found
printf("File not found\n");
return 1;
}
} ```
如果我是 valgrind,我会抱怨这些 if (jpg != NULL)
“条件跳转或移动取决于单元化值”。 FILE *jpg;
声明了文件指针,但没有对其进行初始化。
这将导致“不可预测的结果”,这正是您所描述的。结果将取决于分配给 jpg
的内存以及当程序为 运行 时该内存包含的内容。当 运行 和 debug50
时,内存很可能 是 NULL。不是这样 check50
.
我目前正在研究 CS50x 恢复问题集 4,我已经完成了编码,并且在使用 debug50 时可以正常工作,但在使用 check50 时它可以正常工作 returns this:
:) recover.c 存在。 :) recover.c 编译。 :) 处理缺少取证图像 :( 正确恢复 000.jpg 等待程序退出时超时 :( 正确恢复中间图像 等待程序退出时超时 :( 正确恢复 049.jpg 等待程序退出时超时
都超时了。
而且我也在控制台中看到了这一点,因为当我 运行 它似乎卡在开头时。 这是我的代码:
#include <stdlib.h>
int main(int argc, char *argv[])
{
//check for wrong syntax
if (argc != 2)
{
printf("Usage: ./recover image\n");
return 1;
}
//open card
FILE *file = fopen(argv[1], "r");
//check if file exists
if (file != NULL)
{
//vars
unsigned char buffer[512];
int files = 0;
FILE *jpg;
//read file until end
while (fread(buffer, 512, 1, file) == 1)
{
//check for jpg beginning
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
{
//vars
char jpgname[8];
//generate name
sprintf(jpgname, "%03i.jpg", files);
//do only if jpg exists
if (jpg != NULL)
{
fclose(jpg);
}
//create new file with generated name
jpg = fopen(jpgname, "w");
//increment file counter
files++;
}
//only do when jpg exists
if (jpg != NULL)
{
//write data to file
fwrite(buffer, 512, 1, jpg);
}
}
if (jpg != NULL)
{
//close final jpg
fclose(jpg);
}
//close file finally
fclose(file);
}
else
{
//when file not found
printf("File not found\n");
return 1;
}
} ```
如果我是 valgrind,我会抱怨这些 if (jpg != NULL)
“条件跳转或移动取决于单元化值”。 FILE *jpg;
声明了文件指针,但没有对其进行初始化。
这将导致“不可预测的结果”,这正是您所描述的。结果将取决于分配给 jpg
的内存以及当程序为 运行 时该内存包含的内容。当 运行 和 debug50
时,内存很可能 是 NULL。不是这样 check50
.