最后从C和C2220返回状态

时间:2014-06-16 11:16:43

标签: 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项目)

2 个答案:

答案 0 :(得分:2)

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

PS。微软的C支持是废话。

答案 1 :(得分:1)

您收到编译器错误的最可能原因是因为这不是有效的C。

    C中不存在
  • try(但在C ++,Java,C#中)。
  • C中不存在
  • finally(但在Java,C#中)。
  • leave;无效C,除非这是您尚未发布的宏。
  • 自1999年以来,返回值而不包含return语句的函数在C中无效。而且它们是愚蠢的,因为C的发明。

您可能必须启用非标准语言扩展,否则切换到严格符合C编译器。 Visual Studio因其标准合规性差而臭名昭着。