【问题标题】:Segmentation fault and address sanitizer分段错误和地址清理器
【发布时间】:2019-09-07 18:27:32
【问题描述】:

我的代码中发生了一些奇怪的事情。 我使用fgets 获取文件的每一行,然后使用strtok 解析它。使用 Ubuntu,如果我使用 gcc -o name name.c 编译,它会给我 segmentation fault。如果我使用-fsanitize=address 编译,代码运行完美,没有任何segv。可能是什么问题?

代码是:

char* input;
fgets(input, 1000, stdin);
tok=strtok(input, pars);

但它似乎停在fgets

【问题讨论】:

  • 地址清理程序只能检测某些类型的未定义行为。启用 ASAN 还可以修改生成的代码,使 UB 不再触发分段错误。因此需要minimal reproducible example 来更具体地回答。
  • 好的,我使用 char* 输入; fgets(输入,1000,标准输入); tok=strtok(输入,pars);但看起来它停在 fgets
  • 那不是minimal reproducible example。请再次阅读链接并确保您的示例代码完整可重现
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面并访问描述How to Ask a QuestionHow to create a Minimal, Complete, and Verifiable example 的链接。提供必要的详细信息,包括您的代码、编译器警告和相关错误(如果有),将允许这里的每个人帮助您解决问题。

标签: c fgets strtok segmentation-fault address-sanitizer


【解决方案1】:

可能是什么问题?

你的线路

char* input;

只声明一个指向char 的指针,而不给它分配地址。你认为它会指向哪里?

那你想

fgets(input, 1000, stdin);

最多 999 个字符,但您从不为它们提供空格。

如果你把第一行改成

char input[1000];

它可以在没有分段错误的情况下工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多