"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 崩溃。