[英]My program has AddressSanitizer error but I'm not sure how to read it
我对 C 比较陌生,刚刚完成了一个火车站时刻表程序,该程序从时刻表文件中查找最近的出发时间,相对于用户输入的时间、来源和目的地。 限制是没有 string.h 并且没有任何类型的动态 memory 分配。 该程序在我测试时运行良好,但在标记时,它产生了我们尚未了解的 AddressSanitizer 错误。 我不确定如何阅读错误代码。 以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define lineSize 4096
int main(int argc, char* argv[]) {
if(argc != 4){
printf("Please provide <source> <destination> <time> as command line arguments\n");
return(0);
}
int c = 0;
while(argv[3][c] != 0){
c++;
}
if(c < 8){
printf("Please enter a proper time\n");
return(0);
}
char line[lineSize];
FILE * fpointer = fopen("timetable.list", "r");
int i;
int j;
int StartSize;
int DestinationSize;
int DepartTime;
for(StartSize = 0; argv[1][StartSize] != '\0'; StartSize += 1){
continue;
}
for(DestinationSize = 0; argv[2][DestinationSize] != '\0'; DestinationSize += 1){
continue;
}
for(DepartTime = 0; argv[3][DepartTime] != '\0'; DepartTime += 1){
continue;
}
int hour = 23;
int min = 59;
int sec = 59;
int check = 1;
int matchStart = 0;
int matchEnd = 0;
int checkNearestTime = 0;
int isThereATime = 0;
while(fgets(line, lineSize, fpointer) != NULL){
check = 1;
for(i = 0; i < StartSize; i++){
if(argv[1][i] == line[i]){
matchStart = 1;
continue;
}
else{
check = 0;
matchStart = 0;
}
}
if(check == 1){
i = 0;
int j = StartSize + 2;
while(i < DestinationSize){
if(argv[2][i] == line[j]){
i += 1;
j += 1;
matchEnd = 1;
}
else{
check = 0;
matchEnd = 0;
break;
}
}
}
if(check == 1){
i = 0;
j = StartSize + DestinationSize + 4;
while(i < DepartTime){
if(argv[3][i] == line[j]){
i += 1;
j += 1;
}
else{
check = 0;
break;
}
}
if(check == 1){
printf("The next train to %s from %s departs at %s\n", argv[2], argv[1], argv[3]);
return 0;
}
if(check == 0){
j = StartSize + DestinationSize + 4;
int lineFullHour = (line[j] - '0') * 10 + (line[j+1] -'0');
int lineFullMin = (line[j+3] - '0') * 10 + (line[j+4] -'0');
int lineFullSec = (line[j+6] - '0') * 10 + (line[j+7] -'0');
int argvHour = (argv[3][0] - '0') * 10 + (argv[3][1]-'0');
int argvMin = (argv[3][3] - '0') * 10 + (argv[3][4] -'0');
int argvSec = (argv[3][6] - '0') * 10 + (argv[3][7] -'0');
if(lineFullHour > argvHour){
if(lineFullHour < hour){
hour = lineFullHour;
min = lineFullMin;
sec = lineFullSec;
checkNearestTime = 1;
}
else if(lineFullHour == hour){
if(lineFullMin < min){
min = lineFullMin;
sec = lineFullSec;
checkNearestTime = 1;
}
else if(lineFullMin == min){
if(lineFullSec < sec){
sec = lineFullSec;
checkNearestTime = 1;
}
}
}
}
else if(lineFullHour == argvHour && lineFullMin > argvMin){
if(lineFullHour < hour){
hour = lineFullHour;
min = lineFullMin;
sec = lineFullSec;
checkNearestTime = 1;
}
else if(lineFullHour == hour){
if(lineFullMin < min){
min = lineFullMin;
sec = lineFullSec;
checkNearestTime = 1;
}
else if(lineFullMin == min){
if(lineFullSec < sec){
sec = lineFullSec;
checkNearestTime = 1;
}
}
}
}
else if(lineFullHour == argvHour && lineFullMin == argvMin && lineFullSec > argvSec){
if(lineFullHour < hour){
hour = lineFullHour;
min = lineFullMin;
sec = lineFullSec;
checkNearestTime = 1;
}
else if(lineFullHour == hour){
if(lineFullMin < min){
min = lineFullMin;
sec = lineFullSec;
checkNearestTime = 1;
}
else if(lineFullMin == min){
if(lineFullSec < sec){
sec = lineFullSec;
checkNearestTime = 1;
}
}
}
}
}
}
if(matchStart == 1 && matchEnd == 1 && checkNearestTime == 1){
isThereATime = 1;
}
}
if(isThereATime == 1){
printf("The next train to %s from %s departs at %02d:%02d:%02d\n", argv[2], argv[1], hour, min, sec);
return 0;
}
if(isThereATime == 0){
printf("No suitable trains can be found\n");
return 0;
}
return 0;
}
源代码(第 53 行)和您的报告不匹配(第 59 行)不匹配。 它抱怨 NULL 指针,每个@kaylum,只有当 fpointer 是 NULL 时才会发生。 反过来这意味着│FILE * fpointer = fopen("timetable.list", "r");
失败的。 始终实施错误检查:
#include <errno.h>
#include <string.h>
...
FILE * fpointer = fopen("timetable.list", "r");
if(!fpointer) {
fprintf(stderr, "fopen failed with %s", strerror(errno)));
exit(1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.