c - 以下函数在 strncpy 上给出分段错误,有人可以解释为什么会发生此分段错误
问题描述
IFNAMSIZ = 16
static STATUS_CODE __bind(int sock_fd, const char *interface)
{
struct sockaddr sock_addr;
memset(&sock_addr, '\0', sizeof(sock_addr));
strncpy(sock_addr.sa_data, interface, IFNAMSIZ);
sock_addr.sa_family = AF_PACKET;
if (bind(sock_fd, &sock_addr, sizeof(struct sockaddr)) < 0) {
EPRINT("bind failed: %s", strerror(errno));
return FAILURE;
}
return SUCCESS;
}
解决方案
有人可以解释为什么会发生这种分段错误
在 Linux 上,您的代码可能在此处出现堆栈缓冲区溢出:
strncpy(sock_addr.sa_data, interface, IFNAMSIZ);
假设IFNAMSIZ = 16
,因为sizeof(sa_data) == 14
。但是,这极不可能导致- 堆栈SIGSEGV
上 strncpy
还有很多其他数据。
更可能导致崩溃的原因是interface
您传入的是NULL
. -g
通过使用调试信息(通常是标志)编译程序并在调试器下运行它,这应该是微不足道的。
推荐阅读
- mysql - 聚合后Django ORM加入自我
- mongodb - 在 mongodb 上按年分组
- jmeter - 在mac上运行jmeter的问题
- sql - 在同一列的行之间应用条件
- azure-ad-b2c - 用户旅程正文中的 Azure B2C Rest API 为空
- php - PHP,数组-混合顺序,steam api返回不同顺序
- sas - SAS:如何测试一个值在时间之间的稳定性
- javascript - SameSite=Lax 是否应该允许 3rd-party GET?
- python - 如何将外部库导入 Ansible 模块?
- asp.net - .NET ApiController:使用 [FromBody] T 的自定义模型绑定行为