"segmentation fault" 是由 fopen 行引起的 C 中的堆栈溢出问题吗? (暗网,detector.c)
Is "segmentation fault" caused from fopen line a stack overflow problem in C? (darknet, detector.c)
正在体验暗网YOLOv4。我想将检测结果记录行添加到此 mAP 示例代码中。
我想我写了一行根据语法写文件,但是在操作“fopen”的那一行出现了“segmentation fault”错误。
像 printf 这样的行效果很好。
下面附上暗网detector.c的validate_detector_map()部分
https://github.com/AlexeyAB/darknet/blob/master/src/detector.c#L940
下面是我添加的部分。(////ju 已添加~ /////////)
... // For multi-class precision and recall computation
float *avg_iou_per_class = (float*)xcalloc(classes, sizeof(float));
int *tp_for_thresh_per_class = (int*)xcalloc(classes, sizeof(int));
int *fp_for_thresh_per_class = (int*)xcalloc(classes, sizeof(int));
for (t = 0; t < nthreads; ++t) {
args.path = paths[i + t];
args.im = &buf[t];
args.resized = &buf_resized[t];
thr[t] = load_data_in_thread(args);
}
////ju added //파일 열려야 하는 위치
printf("\nlogging start.. \n\n");
FILE *log_csv;
printf('%d\n', fileno(log_csv));
if(!(fopen("/home/aicar/darknet/0_log_ju0.csv", 'a')))
{
printf("failed to open csv file\n\n");
exit(1);
}
else
{
printf("csv file opened\n\n");
fprintf(log_csv, "timestamp, class_id, gt, conf_mat, \n" ); //header row
fclose(log_csv);
}
//////////
time_t start = time(0);
for (i = nthreads; i < m + nthreads; i += nthreads) { ......
这是堆栈溢出问题吗?我之所以这么认为是因为作者使用了免费功能
fopen
returns 一个文件句柄。就在上面的几行中,你定义了一个变量 FILE *log_csv;
,它可能是你想要放置该句柄的地方。
此外,fopen
的第二个参数是 C-string(即指向以 NUL 结尾的字符数组的指针)。 TTBT,我很惊讶你的编译器居然让这个通过了。
试试这个:
FILE *log_csv = fopen("/home/aicar/darknet/0_log_ju0.csv", "a");
if( !log_csv ){
printf("failed to open csv file\n\n");
exit(1);
} else {
printf("%d\n", fileno(log_csv));
…
}
这段代码也很危险:
FILE *log_csv;
printf('%d\n', fileno(log_csv));
fileno()
函数将尝试取消引用 log_csv
,它不指向 FILE
结构,因此极有可能导致 SIGSEGV
崩溃。
正在体验暗网YOLOv4。我想将检测结果记录行添加到此 mAP 示例代码中。 我想我写了一行根据语法写文件,但是在操作“fopen”的那一行出现了“segmentation fault”错误。 像 printf 这样的行效果很好。
下面附上暗网detector.c的validate_detector_map()部分
https://github.com/AlexeyAB/darknet/blob/master/src/detector.c#L940
下面是我添加的部分。(////ju 已添加~ /////////)
... // For multi-class precision and recall computation
float *avg_iou_per_class = (float*)xcalloc(classes, sizeof(float));
int *tp_for_thresh_per_class = (int*)xcalloc(classes, sizeof(int));
int *fp_for_thresh_per_class = (int*)xcalloc(classes, sizeof(int));
for (t = 0; t < nthreads; ++t) {
args.path = paths[i + t];
args.im = &buf[t];
args.resized = &buf_resized[t];
thr[t] = load_data_in_thread(args);
}
////ju added //파일 열려야 하는 위치
printf("\nlogging start.. \n\n");
FILE *log_csv;
printf('%d\n', fileno(log_csv));
if(!(fopen("/home/aicar/darknet/0_log_ju0.csv", 'a')))
{
printf("failed to open csv file\n\n");
exit(1);
}
else
{
printf("csv file opened\n\n");
fprintf(log_csv, "timestamp, class_id, gt, conf_mat, \n" ); //header row
fclose(log_csv);
}
//////////
time_t start = time(0);
for (i = nthreads; i < m + nthreads; i += nthreads) { ......
这是堆栈溢出问题吗?我之所以这么认为是因为作者使用了免费功能
fopen
returns 一个文件句柄。就在上面的几行中,你定义了一个变量 FILE *log_csv;
,它可能是你想要放置该句柄的地方。
此外,fopen
的第二个参数是 C-string(即指向以 NUL 结尾的字符数组的指针)。 TTBT,我很惊讶你的编译器居然让这个通过了。
试试这个:
FILE *log_csv = fopen("/home/aicar/darknet/0_log_ju0.csv", "a");
if( !log_csv ){
printf("failed to open csv file\n\n");
exit(1);
} else {
printf("%d\n", fileno(log_csv));
…
}
这段代码也很危险:
FILE *log_csv;
printf('%d\n', fileno(log_csv));
fileno()
函数将尝试取消引用 log_csv
,它不指向 FILE
结构,因此极有可能导致 SIGSEGV
崩溃。