strncpy导致LPC-2378挂起/死亡

时间:2013-02-23 21:31:09

标签: c embedded strncpy

我正在为Olimex LPC2378-STK做一些工作。

我有以下声明。

unsigned char buffer[256];

然后我尝试做:

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

有谁知道这会导致问题的原因。

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

有人有任何想法吗?

3 个答案:

答案 0 :(得分:5)

您发布的代码没有任何内在错误,但它没有上下文。例如,如果buffer[]是一个局部变量,它将在堆栈上创建,并且您可能会溢出堆栈。

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

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

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

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

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

unsigned char buffer[256] = "CREATED_BY" ;

答案 1 :(得分:1)

strncpy可能会出现很多问题:

  1. 您正在尝试写入尚未分配的内存,具有NULL地址,或者您没有权限(对char *的强制转换具有高度可疑性),
  2. 您的缓冲区内容未以NUL终止
  3. 你的缓冲区溢出,覆盖了一些东西。
  4. 使用调试器。

答案 2 :(得分:0)

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

我发生的事情是我没有配置启动代码(如果使用keil)为HEAP内存预留空间。 printf系列函数使用malloc和free,因此,HEAP空间是必需的。

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