2016-04-01 2 views
1

Похож на ошибку SAL. Код:Анализ кода не понимает параметр _In_opt_ Аннотация?

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); 
     } 
    } 

И код 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." .. не undestand если CA не может обрабатывать такие простые вещи, то, что он может :(

ответ

1

Это выглядит как проблема с тем, как ваш обработки ошибок структурирована, а не параметр _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); 
    } 
} 
+0

Согласен с вами ... то есть более чище. Но все же это ошибка CA :) C6102 никогда не должен подниматься для _In_opt_ parametr IMHO. –

Смежные вопросы