C语言 处理导致分段错误的空字符串输入



>我正在将消息结构的内容编码到缓冲区中。

int encode(const struct message *msg, unsigned char *buffer, size_t max_size)
{
  if (buffer == NULL)
    return -1;
  unsigned char *buf_pos = buffer;
  unsigned char *ep = buffer + max_size;
  if (buf_pos + 1 <= ep) {
    *buf_pos++ = SYNC_WORD_1;
  } else {
    return buf_pos - buffer;
  }
  .
  .
  .
}

当我调用encode(&message, "", 1024);时,我遇到了预期的分段错误。我的理解是,段错误是由尝试访问未分配给程序的内存引起的,因为""将只包含空终止符,并且我传递它代替指针。

我遇到的问题是当我尝试处理此错误时。我还没有找到一种方法来识别无效输入,该输入既不会导致有效输入的误报,也不会导致其他段错误。

那么,淘汰这种输入的正确方法是什么?

这是不可能的。

基本上是在问"给定一个指针,我如何确保那里有n个可写空间?"这是一个C对你没有帮助的问题。

从根本上说,这是因为指针只是地址,因此没有与每个指针值相关联的那种其他元信息。

您可以检查指针是否NULL,但这基本上是您可以确定的唯一指针值无效。非可移植(特别是在嵌入式目标上(,您可以变得聪明并检查指针是否位于各种已知的不可写区域中,但这仍然非常粗糙。

我想您在复制缓冲区时没有检查缓冲区的大小buf_pos尝试访问 buf_pos + 1 时,您可能会进入一些无法访问的内存,从而导致分段错误。您是否在可执行文件上尝试过 usung valgrind?

当询问有关运行时问题的问题时,就像这个问题所做的那样,发布实际输入、预期输出、实际输出,最重要的是,发布代码代码,这些代码可以干净地编译,很短,并且仍然表现出问题。

下面的代码将处理指向仅包含 NUL 字节的字符串的指针。

然而,这不是唯一的问题。 如果传入的缓冲区指针可能指向只读内存中的 char 数组,那么发布的代码仍会导致 seg 错误事件。

int encode(const struct message *msg, unsigned char *buffer, size_t max_size)
{
    if (buffer == NULL)
        return -1;
    if( strlen(buffer) == 0 )
        return -1;
    unsigned char *buf_pos = buffer;
    unsigned char *ep = buffer + max_size;
    if (buf_pos + 1 <= ep)
    {
        *buf_pos++ = SYNC_WORD_1;
    }
    else
    {
        return buf_pos - buffer;
    }
    .
    .
    .
}

为了能够为您提供更多帮助,您需要发布将调用此函数的方案。

相关内容

  • 没有找到相关文章

最新更新