1

看起来像 SAL 错误。编码:

    PAAFILEFILTER_PROTECTED_FILE curFile = NULL;

     try
        {
            status = GetProtectedFile(FileIdInfo, instanceContext, &curFile);
            if(!NT_SUCCESS(status))
            {
                TraceError("Can't GetProtectedFile with status: %!STATUS!\n", status);
                leave;
            }
         ...


    finally
    {
        if(NT_SUCCESS(status))
        {
            LogMessage(AAFILEFILTER_FILE_UNPROTECTED, NULL, NULL, NULL, 0, (PUCHAR)FileIdInfo, sizeof(AAFILE_ID_INFORMATION));
        }
        else
        {
            TraceProtectedFile(curFile);
        }
    }

代码分析给我C6102 - 使用来自失败函数调用的变量

在线TraceProtectedFile(curFile);但是 TraceProtectedFile 有原型

_In_opt_ PAAFILEFILTER_PROTECTED_FILE protectedFile

_In_opt_ 的 意思是"_In_opt_ is the same as _In_, except that the input parameter is allowed to be NULL and, therefore, the function should check for this."..不要理解如果 CA 不能处理这么简单的事情,那么它可以:(

4

1 回答 1

1

这看起来像是错误处理结构的问题,而不是_In_opt_参数的问题。

leave如果与标准 C++ 异常处理混合时,如果 SAL 足够混淆以至于它无法识别finally永远不会被命中,我不会感到惊讶。leave不是标准 C++ 异常的一部分,并且是特定于 MSVC 的,用于结构化异常处理

好消息是,SAL 的困惑暗示其他开发人员可能对这样的错误处理同样感到惊讶。您可能应该考虑将GetProtectedFile调用移到try/之外finally,因为所有代码都假定 curFile 已成功初始化:

PAAFILEFILTER_PROTECTED_FILE curFile = NULL;

status = GetProtectedFile(FileIdInfo, instanceContext, &curFile);
if(!NT_SUCCESS(status))
{
    TraceError("Can't GetProtectedFile with status: %!STATUS!\n", status);
    return; // Return whatever is appropriate here
}

// The rest of your code can assume curFile initialized successfully

try
{  
    ...
}
finally
{
    if(NT_SUCCESS(status))
    {
        LogMessage(AAFILEFILTER_FILE_UNPROTECTED, NULL, NULL, NULL, 0, (PUCHAR)FileIdInfo, sizeof(AAFILE_ID_INFORMATION));
    }
    else
    {
        TraceProtectedFile(curFile);
    }
}
于 2016-04-01T19:19:18.897 回答