Linux/gcc/clangから来ているので、Windows/Visual Studioで作業することが増えています。
私が本当に欠けているのはアドレスサニタイザーです(境界チェック、リーク、解放後の使用など)。私はいくつかの調査を行い、いくつかのことを試しましたが、完全で(機能的に)信頼性の高い代替品が見つかりませんでした。たとえばメモリ博士を試しましたが、Qtベースのプログラムでは機能しないことを知りました(少なくともWindows 10では)。
では、Windows/MSVCでアドレスサニタイザーのような機能を取得するにはどうすればよいですか?
少なくともclangのASanとUbsanはWindowsで動作するはずですが、いくつかの制限があります。これらは、cl.exeのドロップイン置換としてclang-clを使用するmsvcツールチェーンで使用できます。Googleは これに取り組んでいます 、mozilla too のようです。
私が認識している問題(そしてそれが原因で、今まで自分で使用できなかった問題):
必要なライブラリとのリンクは自動ではありません。アプリケーションでのCRTのリンク方法に応じて、2つのバージョンがあります(/ MTは静的CRTを、/ MDは動的CRTを意味し、後者は通常Qtで使用されます)。必要なリンカーパラメーターを見つけるには、Visual Studioコマンドプロンプトを開き、clang binフォルダーをパスに追加し、次のようなclang-clを使用して単純なmain.cpp(空のメイン関数)をコンパイルします:clang-cl -v /MD -fsanitize=address main.cpp
必須link.exeコマンドは詳細出力の最後にあり、そこからリンクに必要なライブラリを抽出します。
windowsではリリースビルドのみがサポートされています
windowsでの例外のサポートなし( this の問題を参照)
wiki のように、Windowsポートではこれ以上の作業はありません。ひどく古い(2015年の最後の変更)ので、多くの人がこれを生産的に使用しているとは思えません。そのため、他のユーザーからオンラインでサポートを受けるのはかなり難しいかもしれません...
Windowsの他の選択肢について話すと、次のとおりです。
Linux IMOのサニタイザーとValgrindは、これらのツールよりもはるかに高度であり、パフォーマンスが優れているため、少なくともQtなどのクロスプラットフォームツールキットを使用する場合、Linuxでアプリケーションを構築し続けることが最善の考えです( )。
Microsoftは、Address Sanitizerを Visual Studio 2019バージョン16.1プレビュー 以降に統合しました。残念ながら現在のところLinuxビルドのみがサポートされています。しかし、少なくとも、お気に入りのIDEを使用して、WSLでアプリをデバッグできます。
MSVC自体には、すでに CRT Debug Heap のようなメモリの問題をデバッグするためのさまざまなツールが含まれていることに注意してください。前述のAdrian McCarthyまたは Control Flow Guard です。
箱の外からコードを安全にしようとする多くのツールがあります。Valgrindとアドレス/スレッドのサニタイザは人気のある例です。また、Windowsにもこれらのツールの多くがあり、Microsoftと他社の両方が提供しています。ただし、MSVCは、セキュリティとコードを統合するコンパイラ内部の強力なテクノロジーを備えています。たとえば、 Control Flow Guard は、多くのメモリ破損の脆弱性と闘う高度に最適化されたセキュリティ機能です。現在のセキュリティ調査について率直に話すことはできませんが、私たちは常にあなたのコード(そして私たちのコード!)を、ますます巧妙化する攻撃者から安全にするために取り組んでいます。
https://devblogs.Microsoft.com/cppblog/msvc-the-best-choice-for-windows/
こちらもご覧ください