代码分析不懂_In_opt_参数注解?
Code analysis doesn't understand _In_opt_ parameter Annotation?
看起来像 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);
}
}
and code analysys 给我 C6102 - Using variable from failed function call
在第 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 的,用于 structured exception handling.
好消息是,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);
}
}
看起来像 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);
}
}
and code analysys 给我 C6102 - Using variable from failed function call
在第 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 的,用于 structured exception handling.
好消息是,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);
}
}