c - 最后从 C 和 C2220 返回状态

标签 c visual-studio compiler-warnings try-catch-finally

我正在使用代码作为

NTSTATUS
Register (_In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType)
{
    NTSTATUS status = STATUS_FLT_DO_NOT_ATTACH;

    try {

        if (VolumeFilesystemType != FLT_FSTYPE_NTFS) {

            status = STATUS_NOT_SUPPORTED;
            leave;
        }

        ...

    }
    finally {
        if (!NT_SUCCESS(status)) {
            KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "AAFileFilter!Failed to register with status: %x\n", status));
            return STATUS_FLT_DO_NOT_ATTACH;
        }
        else
        {
            return  STATUS_SUCCESS;
        }
    }
}

我得到了 C2220对于 warning C4532 .如果我将代码更改为

...
    finally {
        if (!NT_SUCCESS(status)) {
            KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "AAFileFilter!Failed to register with status: %x\n", status));
        }
    }

    if (NT_SUCCESS(status)) 
    {
        return STATUS_SUCCESS;
    }
    else
    {
        return STATUS_FLT_DO_NOT_ATTACH;
    }
}
  • 警告消失.. 不明白这是什么原因?在这两种情况下,代码对我来说应该完全一样。 (我在 C 中使用 VS2013 和 WindowsKernelModeDriver8.1 项目)

最佳答案

使用 return 语句或 longjmp 运行时函数退出 try-finally 语句被视为异常终止。您可能会收到有关此的警告,并且警告被视为错误。

附言。 Microsoft 对 C 的支持很糟糕。

关于c - 最后从 C 和 C2220 返回状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24242437/

相关文章:

c - 使用原始套接字重新传输大数据包

c# - 打开解决方案/文件时 Visual Studio Professional 2013 崩溃

visual-studio - 输入 lambda 符号的更快方法

c - 使用 fscanf 只读取字母字符

c - 非常简单的C程序,为什么我得到这样的输出?

c++ - 如何使用 visual studio 构建 o2scl?

c++ - 为什么在声明对象 std::vector 但从未使用时编译器不发出警告?

c - 在 C 中将常量类型转换为 short int 时发出警告

compilation - f951 错误 : unrecognized command line option

c - 程序不运行。说我正在尝试为指针赋值