c - 处理导致段错误的空字符串输入

标签 c segmentation-fault

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

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,但这基本上是您可以确定的唯一指针值无效。不可移植(尤其是在嵌入式目标上)您可以变得聪明并检查指针是否在各种已知的不可写区域中,但这仍然非常粗糙。

关于c - 处理导致段错误的空字符串输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43395572/

相关文章:

objective-c - libgcrypt 的 Xcode 错误

c++ - pthreads 的 Makefile

c++ - C/C++ 中有自然数的基本类型吗?

c++ - 使用 std::set of pointers 时出现段错误...谁能解释一下?

c++ - 线程 1 中的堆栈溢出 : can't grow stack to 0xffe601ff8 Valgrind Error

c - 将节点添加到链表时出现段错误

c - 使用 ftw 和 process 打印目录大小及其路径名的打印问题

c - 数组和初始化多个计数器

c++ - std::function 析构函数中的段错误

linux - 当调试器可以手动写入同一内​​存时,为什么在尝试执行写入内存的指令时会出现段错误?