Анализ кода не понимает _In_opt_ параметр Аннотация?

Похоже, ошибка 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 не может справиться с такими простыми вещами, то что он может:(

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);
    }
}
Другие вопросы по тегам