問題タブ [prefast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
visual-studio-2008 - VisualStudio2008でPrefast
Visual Studio 2008 Professionalの追加でPrefastを有効にする方法はありますか?
ネイティブC++コードをコンパイルしようとしています。
私は次のことを試みました、
- ダウンロードしたWindowsSDK
- コンパイラのBin/Include/LibパスをSDKに設定します。
- c / c ++コンパイル用の追加オプションを追加しました(/ Analyze:WX-)
これらの手順により、prefastを使用して静的分析を実行する適切なコンパイラが設定されているはずです。この設定は、実際にはVisual Studio 2005で機能しました。ただし、VisualStudio2008では機能しません。
それは常に2つの問題を引き起こします
- リンク:警告LNK4044:認識されないオプション'/ MANIFESTUAC:level ='asInvoker'uiAccess ='false''; 無視されます
- 致命的なエラーLNK1103:デバッグ情報が破損しています。モジュールを再コンパイルします
1の理由は、WindowsSDKが/MANIFESTUACオプションを識別しないためだと思います。これは、Visual Studio 2008で導入されました。2の理由、わかりません:)。
どんなアイデア/提案/ポインタも大歓迎です。
visual-studio - Visual Studio 2008 のプレファスト
Prefast for Visual Studio 2008 はどこでダウンロードできますか? Google または MSDN Web サイトで見つけることができません。
c++ - VS 2010のPreFast?
VS 2010のどのバージョンにネイティブC++用のPreFast静的コードアナライザーがありますか?すべての機能が含まれることを期待してVS2010Ultimate Editionの試用版をダウンロードしましたが、組み込みのPreFastが見つかりませんでした。VS 2010をリンクしてWDKのPreFastでディレクトリを設定し、コマンドラインの追加オプションに「/ analysis」を追加しようとしましたが、結果を取得できませんでした。
c++ - Prefast および GCC でのコンパイルでの NULL 逆参照の注釈
次のサンプルコードがあり、それらを回避するために使用できる注釈の種類を知りたいです。
Create
問題は、Prefast が関数のみを評価するため、ポインターを初期化する関数がわからないことです。
__out
ヘッダーファイルの注釈を使用して解決できると思いましたがclassA::Create
、うまくいきませんでした。
__analysis_assume
prefast が関数定義からそれを取得するように、コードのどこにでも良い代替手段があるかどうか疑問に思っています。
次に、これらのプリプロセッサ ディレクティブを使用して、Linux または GCC でコードをネイティブにビルドできるように、ビルド構成をどのようにセットアップすればよいか考えていました。LINUX ビルド上にあるかどうかを確認してから、それらの注釈を空のマクロとして追加する必要がありますか?
c++ - PREfast からのポインタの無効なアクセス (0*1 の 4 バイトを読み取る) エラー
次のようなコードを少しコンパイルしようとしています: (例は 38 行目から始まり、throw は 45 です)
呼び出される ctor は次のようになります。
これについて分析を実行すると、次のエラーが表示されます。
1>d:\code\voodooshader\framework\core\vsshader.cpp(45): 警告 C6385: 無効なデータ: '引数 3' にアクセスしています。読み取り可能なサイズは '1*0' バイトですが、'4' バイトは読み取り: 行: 40、39、41、43
私が知る限り、それはポインターに読み取り可能なバイトが0つあると主張しており、それを渡すときにそのうちの4つを使用しようとしています(それぞれ間違ったものと正しいもの)。これは 32 ビット ビルドなので、ポインタは 4 バイトにする必要があります。
m_Core
スローの をに変更すると、スロー行だけでなく、どこnullptr
にもエラーが発生しません (39 ~ 41 行目と 43 行目に突然エラーが発生しなくなります)。
さらに珍しいことに、throw を完全にコメントアウトすると、次のメッセージが表示されます。
1>d:\code\voodooshader\framework\core\vsshader.cpp(56): 警告 C6385: 無効なデータ: '引数 3' にアクセスしています。読み取り可能なサイズは '1*0' バイトですが、'4' バイトは読む: 行: 40, 39, 41, 43, 48, 49, 50, 52, 54
これにより、一見無関係な行で同じエラーが発生します。
エラーのMSDN の例は、意味のある方法で無関係であるように見え、不正な配列アクセスについて説明しています。
これは何らかの既知のエラーですか、バグですか、それとも単純に読み違えているのですか?
さらに重要なことは、どうすれば修正できるかということです (これは、11kloc コードベースの /w4 /wX のコンパイラまたは PREfast からの唯一の警告です。これは、憎むべき皮肉を山盛りにするのが好きだからです :P)。
編集:いくつかの議論とテストの後、私はさらに2つの奇妙な点を発見しました:
パラメータから注釈を完全に削除して_In_ ICore* const pCore
も、エラーは発生しません。
そのパラメーターの注釈を に変更して_Pre_notnull_ ICore * const pCore
も、エラーは発生しません。_Pre_notnull_
の要件のほとんどを備えている_In_
ため、これは当面の機能的なソリューションですが、正しくないようです。
c - 構造体メンバーの PREfast アノテーション
私の会社のコードには、特定のコンポーネント間の相互運用のための一般的な get() および set() メソッドがあります。しかし、PREfast を実行しようとすると、大量の警告が表示されます。これは、PREfast が get() メソッドが指定されたパラメーターを初期化することを認識していないためです。
問題は、これらのメソッドは非常に一般的であるため、単純にパラメーターを取るのではなく (_Out_
または同様にマークすることができますが、どのデータを返す必要があるかに関するデータを保持する構造体の配列を取ることです。
コード内 (大幅に簡略化):
args.data
によって初期化されていることを PREfast が認識できるように、これに注釈を付ける方法はありますget()
か? それとも、これは複雑すぎて PREfast で処理できないのでしょうか?
編集: を使用するget(1, &args)
と、警告が消えます。したがって、このケースを処理できる PREfast にはいくつかのヒューリスティックがありますが、外部からトリガーできるかどうかはわかりません。
wdk - libcmt.lib削除
最近、クラウドプリントモジュールにいくつかの大きなアーキテクチャの変更(つまり、マルチスレッドのサポート)を行いました。ここでPreFastチェックを実行する必要がありますが、使用しているVisual Studio 2008の現在のエディションにはPreFastチェックのサポートが統合されていないため、WindowsDDKを使用して実行する必要があります。
WDKを使用してソースをビルドしようとしていますが、このエラーが発生します。
エラーLNK2005: "void _cdecl operator delete(void *)"(?3 @ YAXPAX @ Z)はすでにlibcmt.lib(delete.obj)で定義されています
リンカーlibcpmt.lib
は前の段階で使用されていて、deleteメソッドの定義も同じだったと思います。ソースには、異なるモジュールレベルで混合されたcファイルとcppファイルもあります。libcmp.lib
これが、そもそも両方を使用している本当の理由libcpmt.lib
でしょうか?
とにかくこれを修正できますか?私は本当に「正しい」方法を必要としません。私が欲しいのはソースを構築することだけです。そうすれば、PreFastチェックを実行できます(リンク関連の警告については実際には心配していません)。これに関してPreFast警告が表示された場合は、当面スキップできます。
windows-7 - WDK7: IoAttachDeviceToDeviceStack を使用すると、PREfast で "メモリを保持する必要があります" という警告が表示される
PREFast を使用して、Windows7 用のドライバー コード ビルドを確認しています。次のコード行
警告を表示します:
deviceObject は、IoCreateDevice への以前の呼び出しで取得されます。この警告の意味と、それを取り除く方法を知っている人はいますか?
PREfast のヘルプには、「関数を呼び出す前にプログラムが取得しなければならないリソースが、関数の呼び出し時に取得されませんでした。その結果、関数呼び出しは失敗します。」と記載されています。
ヘルプページが提供する例は、KaEnterCriticalRegion と KaLeaveCriticalRegion への呼び出しの間の ExAcquireResourceLite と ExReleaseResourceLite (この警告を与える) への呼び出しのペアを囲んでおり、おそらく警告を取り除きますが、この情報をに適用する方法がわかりませんIoAttachDeviceToDeviceStack への私の呼び出し。
アドバイスをいただければ幸いです。
c++ - このパターンは C++ で機能しますか?
プロジェクトで PREfast 静的コード分析を実行していますが、次のパターンで C6001 'using uninitialized memory' エラーが発生します。
私が利用しようとしているトリックは、select_image のスコープを if-expression だけに許可することです (つまり、if (条件) { expression-block = 条件変数の有効期間 })。
VS はかなり長い間、問題なくコンパイル (およびおそらくこれを実行) してきました。私は長い間このようなコードをステップ実行していませんでしたが、私が知る限り、select_image の演算子 bool() が true を返す場合にのみ if ブロックに入り、if ブロックを終了すると select_image のインスタンスを破棄します。
PREfast は間違っていますか? または、上記のコードと仮定が正しくない微妙なものがありますか?