Анализ кода не понимает _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);
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]