Похоже, ошибка 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 не может справиться с такими простыми вещами, то что он может 🙁
Это похоже на проблему с тем, как устроена ваша обработка ошибок, а не _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);
}
}
Других решений пока нет …