2016-04-01 11 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); 
     } 
    } 

とコード考察を行TraceProtectedFile(curFile)でくれC6102 - Using variable from failed function call

を与えます。しかし、プロトタイプ

_In_opt_ PAAFILEFILTER_PROTECTED_FILE protectedFile 

_In_opt_ CAは、このような単純なものを扱うことができない場合undestandしません... "_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."を意味するが、それは

答えて

1

を:(できるかこれはあなたのエラー処理方法に問題のようにTraceProtectedFileに見えてきました_In_opt_パラメータは、leave場合は、標準C++の例外処理と混合したときに、私は、驚くことではないでしょう

。、ない構造に十分な、それはfinallyがヒットすることはありませんことを認識していないことをSALが混乱している。leaveは標準C++例外の一部ではなく、structured exception handlingを対象としたMSVC固有のものです。

SALの混乱は、他の開発者もこのようなエラー処理によって驚くかもしれないというヒントです。そのコードのすべてがcurFileが正常に初期化されたことを前提として以来、あなたはおそらく、あなたのtry/finallyの外GetProtectedFileコールを移動することを検討すべきである:

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_パラメーターIMHOのために決して上げてはいけません。 –