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が決してヒットしないことを認識できなくても、私は驚かないでしょう。標準の C++ 例外の一部ではなく、MSVC 固有であり、構造化された例外処理をleave目的としています。

良いことに、この SAL の混乱は、他の開発者がこのようなエラー処理に同様に驚く可能性があることを示唆しています。そのコードはすべて、 curFile が正常に初期化されたことを前提としているため、呼び出しを/GetProtectedFileの外に移動することを検討する必要があります。tryfinally

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 に答える