c-strncpy导致LPC-2378挂起/死亡



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

我有以下声明。

unsigned char buffer[256];

然后我尝试做:

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

有人知道为什么这会引起问题吗。

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

有人有什么想法吗?

您发布的代码本质上没有什么问题,但它没有上下文。例如,如果buffer[]是一个局部变量,它将在堆栈上创建,并且可能会溢出堆栈。

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

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

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

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

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

unsigned char buffer[256] = "CREATED_BY" ;

strncpy:可能会出现很多问题

  1. 您正试图写入尚未分配的内存、具有NULL地址或没有权限写入(转换为char *非常可疑(
  2. 您的缓冲区内容未被NUL终止
  3. 您的缓冲区溢出,覆盖了某些内容

使用调试器。

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

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

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

相关内容

  • 没有找到相关文章

最新更新