>我正在将消息结构的内容编码到缓冲区中。
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;
}
.
.
.
}
为了能够为您提供更多帮助,您需要发布将调用此函数的方案。