【问题标题】:strcmp crashes even though both strings are sane [closed]即使两个字符串都正常,strcmp 也会崩溃 [关闭]
【发布时间】:2016-08-10 10:28:23
【问题描述】:

我有一个特殊的问题,我的程序在 strcmp 处崩溃。

在 gdb 核心分析中,我发现被检查的两个字符串都是正常的,这意味着它们的指针不是 NULL 并且它们包含有限的空终止值。

但是其中一个字符串是垃圾(不是变量要包含的那个)

抛开它是垃圾的事实不谈,我真的很想知道为什么 strcmp 会因为 2 个健全的字符串而崩溃?这可能是什么原因?

提前致谢!

编辑:

一个例子,

a = strcmp(b,c);
(gdb) p b
$92 = 0x7f58d3a36b89 "H\205\300uRH\215}\320\350\a\300\361\377A\276"
(gdb) p c
$93 = 0x2041e48 "MAIN"

【问题讨论】:

  • 请提供您出错的示例或证明您观点的示例测试用例
  • 很高兴从核心转储中看到相关信息。
  • 欢迎来到 StackOverflow。请提供a Minimal, Complete, and Verifiable example
  • 指针指向你的程序不允许访问的内存。取消引用指针意味着:访问该内存。
  • 发布代码。调试输出可能会产生误导:bc 的实际值可能无法提供给调试器。

标签: c string strcmp


【解决方案1】:

bc 的值 似乎 可以,但由于优化,尤其是在诸如 strcmp() 之类的函数周围可能会经历强烈的宏扩展,实际值可能不可用到调试器。

问题可能很容易在源代码中发现,您应该将源代码发布到有问题的函数中。

gdb 为变量b 打印的值0x7f58d3a36b89 非常大!您可以尝试以这种方式修改您的代码:

static char bb = *b;
static char cc = *c;
a = strcmp(b, c);

strcmp() 之前强制访问bc 可能会导致崩溃并让您验证b 是否确实是gdb 打印的内容。

【讨论】:

  • 对不起,由于显而易见的原因,我无法按原样显示代码,因为它是封闭源代码。我试图用一个看起来相似的例子来凑合。我正在寻找更多的想法和情况,即使正在比较的两个字符串都可以,但 strcmp 可能会崩溃。有人建议指针在可引用内存之外。如果是这样,为什么 gdb 可以打印它? gdb不应该也抱怨地址越界吗?
  • @Proteen: gdb 也会抱怨。我的猜测是调试信息不​​够精确,gdb 无法为bc 使用正确的值。您可以反汇编代码并亲自查看哪个寄存器被用作导致崩溃的地址。没有更多信息,我们无话可说。为b 打印的值非常大。
猜你喜欢
  • 1970-01-01
  • 2013-08-12
  • 2021-03-18
  • 2020-09-27
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多