单步执行,直到退出没有行号信息的函数__svfscanf_l

Single stepping until exit from function __svfscanf_l, which has no line number information

本文关键字:信息 函数 svfscanf 执行 退出 单步      更新时间:2023-10-16

我正在制作一个C程序。我有一个功能,一切似乎都很好。但是,如果我向其添加另一个变量,它突然不起作用,并且出现分段错误。(如果我使用 gdb,我会收到错误:单步直到退出函数 __svfscanf_l,没有行号信息。程序接收信号:"EXC_BAD_ACCESS"。

这是我的函数:

void condition(char *command) {
printf("CAMMAND: %sn", command);
char *cond;
char *expression;
char *file;
char *buffer;
buffer = malloc(200 * sizeof(char));
sscanf(command, "%s ( %s %s ) %[^n]", cond, expression, file, buffer);
printf("COND: %sn", cond);
printf("EX: %sn", expression);
printf("File: %sn", file);
printf("Command: %sn", buffer);
if (!strcmp(expression, "checke")) {
    printf("CHECK EXISTSn");
    if (file_exists(file)) {
        printf("EXISTSn");
    }
} else if (!strcmp(expression, "checkd")) {
    printf("CHECK DIRn");
} else if (!strcmp(expression, "checkr")) {
    printf("READn");
} else if (!strcmp(expression, "checkw")) {
    printf("CHECK WRITEn");
} else if (!strcmp(expression, "checkx")) {
    printf("CHECK EXn");
} else {
    printf("NOOOOn");
}
}

但是,如果我甚至将其更改为如下所示的内容,则会出现错误。它似乎在 sscanf 电话中失败了。但是当我不添加一些变量时,这有效。

void condition(char *command) {
int flag;
printf("CAMMAND: %sn", command);
char *cond;
char *expression;
char *file;
char *buffer;
buffer = malloc(200 * sizeof(char));
sscanf(command, "%s ( %s %s ) %[^n]", cond, expression, file, buffer);
printf("COND: %sn", cond);
printf("EX: %sn", expression);
printf("File: %sn", file);
printf("Command: %sn", buffer);
if (!strcmp(expression, "checke")) {
    printf("CHECK EXISTSn");
    if (file_exists(file)) {
        printf("EXISTSn");
    }
} else if (!strcmp(expression, "checkd")) {
    printf("CHECK DIRn");
} else if (!strcmp(expression, "checkr")) {
    printf("READn");
} else if (!strcmp(expression, "checkw")) {
    printf("CHECK WRITEn");
} else if (!strcmp(expression, "checkx")) {
    printf("CHECK EXn");
} else {
    printf("NOOOOn");
}
}

似乎想不通这是为什么。任何帮助都会很棒!

内存损坏是因为将指针传递给字符,而不是指向字符数组的指针,作为%s转换的目标。 expression ,如定义,是未初始化的,并指向某个随机内存位置。 以下是sscanf文档的相关部分:

s      Matches a  sequence  of  non-white-space  characters;  the  next
       pointer must be a pointer to character array that is long enough
       to hold the input sequence and the  terminating  null  character

您需要为expression等分配一些空间。