gpt4 book ai didi

c - 警告 'return'无值,函数返回非空-应该返回什么?

转载 作者:行者123 更新时间:2023-12-03 07:41:51 24 4
gpt4 key购买 nike

我该如何解决以下标题出现警告的问题?

struct Nodes* InsertNode(unsigned int IP, unsigned short Port)
{
if (!IP)
return;
if (!Port)
return;
// Above is what chucks the warnings
{
// do stuff & conditionally
return &List[x];
}
// Different conditions & stuff
{
return &List[Other];
}
}

换句话说,如果放弃丢失的数据,它应该返回什么?还是我需要遍历整个代码主体并每次都进行检查以查看是否应调用它?该程序将按照预期的功能在此时返回,如果我要继续使用它(或升级正在运行的操作系统),修复编译器警告似乎是一个好主意,当编译器版本受到影响时,它们往往会变成错误。

this answer中有一条线索可以回答某人询问相同的警告,但是答案并没有给我足够多的信息以进行下一步,我也没有阅读过。

额外信息:检查 IP 端口的可以清理 和List 的内容,这种情况表示来自错误配置的客户端的数据报或来自有恶意的人的流量,这很可悲,但确实发生了。这是我们根本不在乎的无效数据,记录它似乎毫无意义,它不应延迟处理下一个数据,并且绝对不要暂停程序。从gcc 4.9切换到6.3之前,我没有看到警告。当前 返回; 似乎只是给它打了个黑洞,但我只了解代码意图的一部分。

最佳答案

in the case of giving up through missing data, what should it return?



视情况而定。

有几种情况
  • 该函数不能将NULL返回为有效值。

    更换
    if (!IP)
    return;
    if (!Port)
    return;

    通过
    if (!IP || !Port)
    {
    errno = EINVAL; /* Setting errno, allows the caller to log
    the failure using the perror() function. */
    return NULL;
    }

    像这样使用它:
    struct Nodes * p = InsertNode (...);
    if (NULL == p)
    {
    perror("InsertNode() failed");
    /* exit or error logging/handling */
    }
  • 在正常操作下,
  • IPPort永远不会是0。因此,如果是这样,那将是编程错误。

    在这种情况下,您可能不会不返回而是结束程序。

    所以代替
    if (!IP)
    return;
    if (!Port)
    return;

    采用
    assert((IP) && (Port));

    此处没有特定的用法,因为如果不满足断言,该程序只会结束。

    注意,这种方法需要广泛的测试,因为该测试通常会在生产/发布版本中删除!
  • 在正常操作下,该函数可能会返回NULL作为有效值,并且IP和/或Port可能是0

    重新设计功能以一种方式或另一种方式返回单独的错误状态。

    通常可以通过两种方式完成此操作:
  • 使用函数的返回值,并通过作为参数传递的指针返回结果
    int InsertNode(unsigned int IP, unsigned short Port, struct Nodes** ppresult)
    {
    int error_state = 0;

    if (!IP || !Port || !ppresult)
    {
    errno = EINVAL; /* Setting errno, allows the caller to log
    the failure using the perror() function. */
    error_state = -1;
    }
    else
    {
    if (...)
    {
    *ppresult = &List[x];
    }

    ...

    }

    return error_state;
    }

    像这样使用它:
    struct Nodes * p;
    if (-1 == InsertNode (..., &p))
    {
    perror("InsertNode() failed");
    /* exit or error logging/handling */
    }
  • 通过作为参数传递的指针传回错误状态结果
    struct Nodes * InsertNode(unsigned int IP, unsigned short Port, int * perror_state)
    {
    int error_state = 0;

    if (!IP || !Port || !perror_state)
    {
    errno = EINVAL; /* Setting errno, allows the caller to log
    the failure using the perror() function. */
    error_state = -1;
    }
    else
    {
    if (...)
    {
    *ppresult = &List[x];
    }

    ...

    }

    *perror_state = error_state;

    return NULL;
    }

    像这样使用它:
    int result;
    struct Nodes * p = InsertNode (..., &result))
    if (-1 == result)
    {
    perror("InsertNode() failed");
    /* exit or error logging/handling */
    }
  • 关于c - 警告 'return'无值,函数返回非空-应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51806983/

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