【问题标题】:strncpy causing LPC-2378 to hang/diestrncpy 导致 LPC-2378 挂起/死机
【发布时间】:2013-02-23 21:31:09
【问题描述】:

我正在做一些关于 Olimex LPC2378-STK 的工作。

我有以下声明。

unsigned char buffer[256];

然后我尝试这样做:

strncpy((char *)buffer, "CREATED_BY", 255);

有谁知道为什么这会导致问题。

如果我注释掉它运行没有问题但使用它似乎会导致程序死亡的代码行。

有人有什么想法吗?

【问题讨论】:

  • 在这里使用strncpy 没有意义。您可能会避免潜在的缓冲区溢出,但是如果缓冲区不够大,您最终会遇到不同的问题。不过,看起来这不是问题的原因。
  • 我看不出这有什么问题,除了它毫无意义。如果您要使用 strncpy(),您需要记住它总是写入 N 个字符,其中 N 是最后一个参数。。如果源字符串长度(包括空终止符)小于 N,则它将用 0 将剩余空间回填到 N。如果它更长,它将最多复制 N 个字符,并且不会将最后一个字符设置为 0。但它总是以一种或另一种方式写入 N 个字符。我认为您可能在某个地方遇到了另一个问题,该问题超出了 this 缓冲区,并且可能 0-clear 暴露了该问题。
  • 谢谢大家,我一直在摸索。关于其他事情的观点很好。鉴于电路板和堆栈空间的限制,这可能是问题所在。有趣的调试时间。
  • 尽量减少缓冲区大小
  • @Clifford 真的吗?因为根据标准,C9899 §7.23.2.4,p3 "如果s2指向的数组是一个短于n个字符的字符串,则在副本中追加空字符s1 指向的数组,直到 n 个字符全部被写入。”。我曾经使用过的每个声称符合标准的库都会这样做,所以我不确定您正在使用什么库

标签: c embedded strncpy


【解决方案1】:

您发布的代码本质上没有任何问题,但它没有上下文。比如buffer[]是一个局部变量,它会在栈上创建,你有可能是栈溢出了。

您可以将其声明为静态以查看问题是否消失,这将验证堆栈溢出。如果变量需要是临时的,那么您将需要分配一个适当更大的堆栈。

请注意,堆栈溢出可能不会专门发生在 strncpy。 buffer 可能包含在堆栈中,但它的大小可能已将其他对象推到堆栈之外,因此写入 它们 会导致堆栈损坏。失败点通常是当函数尝试使用损坏的返回地址返回时。您真的应该使用调试器来单步执行代码,以查看调用堆栈、堆栈指针以及函数是否在 strncpy 上失败或调用函数返回时发生了什么。

关于代码安全性和可维护性的一点,您应该更喜欢:

strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1);

您还可以更方便地使用初始化程序:

unsigned char buffer[256] = "CREATED_BY" ;

【讨论】:

  • +1 我认为他肯定在说些什么,很难说。推测是通过 UB 借用该缓冲区中的空间来“工作”的其他东西,strncpy()(带有尾部填充.. =P )走过那里的神秘粘液。
【解决方案2】:

strncpy 可能会出错:

  1. 您正在尝试写入尚未分配的内存,具有 NULL 地址,或者您没有权限(对char * 的强制转换非常可疑),
  2. 您的缓冲区内容不是以 NUL 结尾的
  3. 您的缓冲区溢出,覆盖了某些内容。

使用调试器。

【讨论】:

    【解决方案3】:

    我已经处理了您报告的同一问题。

    发生在我身上的是我没有配置启动代码(如果使用 keil)来为 HEAP 内存保留空间。 printf族函数使用malloc和free,所以HEAP空间是必须的。

    如果您使用的是 GCC,问题是您没有正确设置 newlib。检查堆。

    【讨论】:

    • 感谢您的评论。我实际上解决了这个问题,它是我不再需要的额外库和 sha-256 实现之间的冲突。
    • 是的,这可能是裸机嵌入式目标上的许多函数的问题,但 strncpy 既不是“printf 系列函数”,也不是应该分配内存的函数。
    • 非常聪明的@ChrisStratton,我没有注意到我造成的混乱。谢谢。
    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多