【问题标题】:return status from C finally and C2220最终从 C 和 C2220 返回状态
【发布时间】:2014-06-16 11:16:43
【问题描述】:

我正在使用代码作为

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;
        }
    }
}

我为warning C4532 获得了C2220。如果我将代码更改为

...
    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 项目)

【问题讨论】:

  • 嗯?这肯定不是 C 吗?
  • @unwind WindowsKernelModeDriver8.1 项目它只在c..
  • 你没有告诉我们你收到什么警告......
  • @BransDs:对,所以“警告视为错误”告诉​​我们编译器将您的警告视为错误。现在警告是什么?
  • @JohnZwinck 我更新了帖子-“继续”:跳出 __finally/finally 块在终止处理期间具有未定义的行为

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


【解决方案1】:

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

PS。 Microsoft 的 C 支持是垃圾。

【讨论】:

    【解决方案2】:

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

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

    您可能必须启用非标准语言扩展,或者切换到严格遵守的 C 编译器。 Visual Studio 因其糟糕的标准合规性而臭名昭著。

    【讨论】:

    • 这些是 MS 的扩展。
    • 这个答案并不真正相关,但已被接受。莫名其妙。
    • @JohnZwinck 好吧,这个问题被标记为 C,所以这是一个 C 答案。也许需要一些编译器选项来编译这种无意义的语言?我的一般建议是对 C 使用 C 编译器,对废话使用废话编译器。
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2020-08-04
    • 2018-10-10
    相关资源
    最近更新 更多