0

次のサンプルコードがあり、それらを回避するために使用できる注釈の種類を知りたいです。

int Function(classA* pInput) {
   if (pInput == NULL) {
      classA::Create(pInput);
   }

   return pInput->value;
}

Create問題は、Prefast が関数のみを評価するため、ポインターを初期化する関数がわからないことです。

__outヘッダーファイルの注釈を使用して解決できると思いましたがclassA::Create、うまくいきませんでした。

__analysis_assumeprefast が関数定義からそれを取得するように、コードのどこにでも良い代替手段があるかどうか疑問に思っています。

次に、これらのプリプロセッサ ディレクティブを使用して、Linux または GCC でコードをネイティブにビルドできるように、ビルド構成をどのようにセットアップすればよいか考えていました。LINUX ビルド上にあるかどうかを確認してから、それらの注釈を空のマクロとして追加する必要がありますか?

4

2 に答える 2

2

MSalterの答えは、正しい技術的な答えと非常によく似ています。幸い、SALを知らないのではっきりとは言えませんが、技術レベルのソリューションのようです。

ただし、現在のコードを書き直すことをお勧めします…

int Function(classA* pInput) {
   if (pInput == NULL) {
      classA::Create(pInput);
   }

   return pInput->value;
}

なので …

int Function( classA* pInput ) {
   if (pInput == NULL) {
      pInput = classA::Create();
   }

   return pInput->value;
}

ここでの主な問題は、動的に作成されたオブジェクトをリークしているかどうかです。Createそれはメソッドが何をするかに大きく依存します。しかし、それはあなたが漏れているように見えます。

そしてその場合、Createデフォルトで初期化されたオブジェクトを動的に割り当てる以外に何もしませんclassA 。それをより安全かつ効率的に行う方法は次のとおりです。

int Function( classA* pInput ) {
   if (pInput == NULL) {
      return classA().value;
   }

   return pInput->value;
}

最後に、完全なクリーンアップのために、不要なrawポインターを取り除く方法を検討してください。生のポインタは問題を引き起こすからです(あなたのコードはそのほんの一例です)。次に、次のようなことができます。

int function( ClassA const& anObject = ClassA() )
{
   return anObject.value;
}

基本的に、これは元のコードのCレベルではなく、C++レベルのソリューションです。そこで、C ++レベルでの型へのより強い焦点を反映するために、命名規則も変更しました。ここで、型には大文字の最初の文字があり、単なる関数には小文字の最初の文字があります。

それはより単純で、より安全で、またより効率的です。

そして– C ++レベルでは、通常、ばかげたSAL表記に苦労する必要はありません。:-)

乾杯&hth。、

于 2011-09-20T21:39:17.770 に答える
1

のパラメーターにSA が欠落[Post( Null=No )]しているようですclassA*&classA::Create(classA*)

于 2011-09-20T19:22:57.100 に答える