WSL2+VSCodeでC++ファイルをビルド・デバッグする際のtasks.json及びlaunch.jsonの設定

僕がVisual Studio Code（以下VSCode）でC++ファイルをビルド・デバッグするに当たって使用しているtasks.json及びlaunch.jsonの中身は以下の通りです。

###目的
WSLと比べてWSL2の方がパフォーマンスが良いらしいのでWSL2に更新したいが、WSL2ではCドライブにあるファイルの操作が遅い[^1]。そのため従来使っていたファイルをUbuntuのホームディレクトリ直下に移動し、それに伴ってC++ファイルをビルド・デバッグする際の設定、すなわちtasks.json及びlaunch.jsonでファイルの場所を変更する必要がある。
また、tasks.jsonではビルドの際のコンパイルオプションも指定でき、競技プログラミングにおいて便利なのでそれも含めて自分の使っている設定を共有する。

### 誰のための記事か
WSLをWSL2に更新し、ファイルの移動も済んだが、それが原因でビルド・デバッグが上手くいかなくなった人
配列外参照や整数型オーバーフローなどのバグに苦しめられた経験があり、これらのバグを自動で検出してほしい人

### 誰のための記事ではないか
C++を使わない人
→この記事はC++用のビルド・デバッグの設定を扱っています。

VSCodeでのビルド・デバッグの経験が無い人
→まずはこの記事を読みましょう[^2]。

WSL2を使っているが、ファイルの置き場所はCドライブなどWindowsのファイルシステムになっている人
→この記事を読んでください。
[VSCodeのWSLを1から2に更新して運用できるようになるまでにしたこと]
(https://qiita.com/boatmuscles/items/220167989b6d622ed713)





僕が参考にした記事[^2]では使っている環境はWSLですが、以下の設定は僕が現在使っているWSL2 + Remote-WSLの環境に合わせたものとなっています。また、ビルドによって作成する実行ファイルの置き場所をworkspaceFolderではなく、ビルドするファイルのディレクトリ直下としています。これはAtCoder Toolsを使う際に都合が良いためです。

コンパイルオプションの設定は以下のサイトを参考にしました。
[【知っておくと便利】C++で問題を解くときにおすすめのコンパイルオプション - TechFULの中の人]
(https://triple-four.hatenablog.com/entry/20210623/1624458051)

```json:tasks.json
{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: g++ build active file",
			"command": "/usr/bin/g++",
			"args": [
				"-fdiagnostics-color=always",
				"-std=gnu++17",//c++17の機能を有効にし（std=c++17）、更にGNU拡張（？）を有効にする（std=gnu++17）
                "-g",//行番号などの情報を渡し、コンパイル・実行時エラーの際に表示させる
                "-O0",//最適化をしない（デバッグ機能を使う際は最適化をしない方が有利）
                "-I/home/boatmuscles/atcoder-workspace/",//自分がダウンロードしたAtCoder Libraryのatcoderフォルダのパス
				"-Wsign-compare",//符号付き整数と符号無し整数を比較する場合に警告
				"-Wparentheses",//代入式の値を真偽値として使っている場合（e.g. if(x=0)）に警告
				"-Wuninitialized",//初期化していない変数を式の中で使うと警告
				"-fsanitize=address,undefined",//addressは領域外参照などを、undefinedは整数型のオーバーフローや0除算などの未定義動作を、それぞれ実行時に検出し報告
				"-fno-omit-frame-pointer",//-fsanitize=addressに付けるといいやつ
				"-fno-sanitize-recover",//sanitizeの項目に引っかかったら即座にプログラムを終了させる
				"${file}",//パスを含めたファイル名
				"-o",//作成した実行ファイルに以下の名前を付ける
				"${fileDirname}/a.out"//ファイルと同じディレクトリにa.outという名前で実行ファイルを作成
			],
			"problemMatcher": [
				"$gcc"
			],
            "group": {
                "kind": "build",
                "isDefault": true
            }
		}
	]
}
```

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Bash on Windows Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/a.out",//デバッグ対象のファイルと同じディレクトリにあるa.outという実行可能プログラムを実行
            "args": ["<", "${workspaceFolder}/problem.in"],//workspaceFolderのproblem.inというファイルを一度作り、デバッグの都度に検証したい入力をそこに保存する
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "externalConsole": true,
            "pipeTransport": {
                "debuggerPath": "/usr/bin/gdb",
                "pipeProgram": "/usr/bin/bash",
                "pipeArgs": ["-c"],
                "pipeCwd": "/"
            },
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],

        }
    ]
}
```

[^1]:1. [WSL 1 と WSL 2 の比較 | Microsoft Docs]
(https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions)
[^2]:2. [【VScode＋WSLで始める】競プロ用C++デバッグ環境構築](https://qiita.com/2019Shun/items/5ab290a4117a00e373b6)