控件通过自定义退出函数到达非void函数的结尾

时间:2014-12-27 12:51:05

标签: c gcc return compiler-warnings suppress-warnings

在试图摆脱我的GCC警告代码时,我发现了一个奇怪的错误/行为。我的程序使用自定义退出函数执行一些清理,最后调用exit()

然而,我使用此退出函数导致GCC产生虚假警告:

  

控件使用自定义退出函数

到达非void函数的结尾

导致此错误的程序示例如下:

FILE1.C:

extern void CleanExit(int ExitCode);

int MyFunc(int ErrorCode)
{
    if(-1 == ErrorCode)
        return -1;
    if(1 == ErrorCode)
        return 1;
    if(2 == ErrorCode)
        return 0;
    if(3 == ErrorCode)
        CleanExit(0);
    CleanExit(-1);
}

file2.c中:

void CleanExit(int ExitCode)
{
    /* Do Some Cleanup */
    exit(ExitCode);
}

有没有办法摆脱这些警告而不会对使用这种结构的每个功能添加无用的瑕疵?

我更愿意使用标准C,但如果需要,我愿意使用某种GCC编译指示。

3 个答案:

答案 0 :(得分:4)

您使用GCC标记了您的问题。因此,您可以尝试使用GCC指定属性,而不是将函数从void更改为int并在任何地方添加return。在__attribute__((noreturn))声明之上添加CleanExit()。这将提醒编译器CleanExit()永远不会直接返回给调用者。

答案 1 :(得分:3)

这应该这样做

extern int CleanExit(int ExitCode);

int MyFunc(int ErrorCode)
{
    if(-1 == ErrorCode)
        return -1;
    if(1 == ErrorCode)
        return 1;
    if(2 == ErrorCode)
        return 0;
    if(3 == ErrorCode)
        return CleanExit(0);
    return CleanExit(-1);
}

int CleanExit(int ExitCode)
{
    /* Do Some Cleanup */
    exit(ExitCode);
}

答案 2 :(得分:0)

那些警告并不是虚假的 - 是从函数返回(最终从main返回退出)和在另一个函数中调用exit()之间的区别函数终止整个程序。在这种情况下,您真的不需要知道这些差异,但如果您愿意,可以read关于them

在这种情况下,问题在于您的功能签名。 MyFunc预计会返回int,但在调用CleanExit时不会返回exit。结果,编译器抱怨缺少返回(但是足够聪明以识别CleanExit调用并在返回的位置记下它。)

要解决此问题,只需在CleanExit之后添加悬空返回。因为... CleanExit(-1); return -1; ... 会终止整个程序,所以您不必担心该值的重要性:

{{1}}