gpt4 book ai didi

c++ - 警告 C4715 : 'd2cs_conn_set_addr' : not all control paths return a value

转载 作者:行者123 更新时间:2023-11-30 05:22:29 25 4
gpt4 key购买 nike

我在编译 C++ 构建时遇到了一些问题:我收到了来自编译器的两条警告。

connection.c(813): warning C4715: 'd2cs_conn_set_addr' : not all control paths return a value

这是代码指向我的地方:

extern int d2cs_conn_set_addr(t_connection * c, unsigned int addr)
{
ASSERT(c,-1);
c->addr = addr;
}

fdwatch_iocp.c(246): warning C4700: uninitialized local variable 'ret' used

这篇文章的要点:

if ((rw & fdwatch_type_read) && !(rw & fdwatch_type_accept) && !(orig_state & fdwatch_type_read))

{

memset(tmpev, 0, sizeof(WSAOVERLAPPED));

ret = WSARecv(fdw_fd(fdw_fds + idx), &wsaBuf, 1, &dummy1, &dummy2, (LPWSAOVERLAPPED)tmpev, NULL);

if ((ret == -1) && (err = GetLastError()) != 997)

{

eventlog(eventlog_level_fatal, __FUNCTION__, "cannot update iocp sock %d with read state: %d", fdw_fd(fdw_fds + idx), err);

//printf("Error %d on WSARecv\n", err);

}

if (fdw_rw(cfd) & fdwatch_type_read && pending_ev->events == fdwatch_type_read)
{
if (hnd(fdw_data(cfd), fdwatch_type_read) == -2)
{
return;
}
memset(tmpev, 0, sizeof(WSAOVERLAPPED));
WSARecv(fdw_fd(fdw_fds + idx), &wsaBuf, 1, &dummy1, &dummy2, (LPWSAOVERLAPPED)tmpev, NULL);
if ((ret == -1) && (err = GetLastError()) != 997)
{
eventlog(eventlog_level_fatal, __FUNCTION__, "cannot update iocp sock %d with read state: %d", fdw_fd(fdw_fds + idx), err);
//printf("Error %d on WSARecv\n", err);
}

我没有编写代码,我只是想编译没有错误。

最佳答案

第一个警告很明确:函数被声明为返回一个 int,但不返回任何内容。如果它被调用,它将导致程序的未定义行为 (UB)。

对于第二个警告,UB是否会发生取决于这两个条件之间的关系:

  • (rw & fdwatch_type_read) && !(rw & fdwatch_type_accept) && !(orig_state & fdwatch_type_read)
  • fdw_rw(cfd) & fdwatch_type_read && pending_ev->events == fdwatch_type_read

如果第二个暗示第一个,一切都很好,可以安全地忽略警告。如果第一个为假而第二个为真,这种情况将再次调用 UB(因为 ret 仅在第一个为真时才初始化)。


分析到此为止,得出结论。

如果不了解程序应该做什么,我们就不可能说出如何修复这些警告。从技术上讲,最直接的修复方法是从 d2cs_conn_set_addr 返回 something1,并将 ret 初始化为 其他功能中的某物2

让我们先看看ret

由于涉及 ret 的两个条件似乎都将 -1 视为错误值,因此对于 something2 来说是一个很好的值。/em> 可以是 -1(基本上,将其初始化为错误状态)。

但是,仔细查看代码会发现您发布的两种情况下的代码之间存在差异。最上面的一个调用 WSARecv 并将其返回值分配给 ret,而第二个简单地调用 WSARecv 并忽略返回值。因此,更可能的正确解决方法是将第二条这样的行从

WSARecv(fdw_fd(fdw_fds + idx), &wsaBuf, 1, &dummy1, &dummy2, (LPWSAOVERLAPPED)tmpev, NULL);

ret = WSARecv(fdw_fd(fdw_fds + idx), &wsaBuf, 1, &dummy1, &dummy2, (LPWSAOVERLAPPED)tmpev, NULL);

(这顺便说明了为什么只在需要的地方声明变量是个好主意)

现在为 d2cs_conn_set_addr

这个比较棘手。如果你想找到合适的返回值,你需要检查调用点(调用该函数的地方)并查看他们期望的返回值。他们可能会期望一个成功/失败的返回值,可能是非零与 0,或者 0-1,或者其他别的。这样的检查会告诉你应该返回什么。这可能是成功代码,因为该函数不会以任何明显的方式失败。

当然除非 ASSERT(c, -1) 的使用实际上扩展为

if (!c) return -1;

或类似的,这会给它一个失败模式(并且还建议正确的返回值可以是 0 或“-1 以外的任何值”或“任何值非负数”)。

因此,除了调用 d2cs_conn_set_addr 的代码之外,还要检查 ASSERT 的定义,希望能更好地理解如何修复它。


总而言之:这段代码完全错误,如果这种程度的错误设法潜入其中,谁知道那里还潜伏着什么其他问题。如果可能的话,您应该避开它并且不要使用它。

如果您坚持使用它,则需要对潜在问题进行非常彻底的检查。

关于c++ - 警告 C4715 : 'd2cs_conn_set_addr' : not all control paths return a value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39633899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com