バグの原因.com その1 再帰関数内で参照をしたまま変数を書き換えたらバグった.

問題

D - Peaceful Teams

バグの内容

==12591==ERROR: AddressSanitizer: heap-use-after-free on address 再帰関数内で参照をしたまま変数を書き換えたらバグった.もしバグった原因が原因が分かる方がいたら教えてください. ↓ 連絡先

えおえお (@eoeo_ooo) / Twitter

コード

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void solve([[maybe_unused]] int test) {
    ll n, t, m;
    cin >> n >> t >> m;
    vector<ll> a(m), b(m);
    vector not_friend(n, vector<bool>(n));
    for (ll i = 0; i < m; i++) {
        cin >> a[i] >> b[i];
        a[i]--, b[i]--;
        not_friend[a[i]][b[i]] = true;
        not_friend[b[i]][a[i]] = true;
    }

    ll ans = 0;
    vector<vector<ll>> teams;

    auto dfs = [&](auto&& self, ll added) -> void {
        if (added == n) {
            ll sz = teams.size();
            if (sz == t) {
                ans++;
            }
            return;
        }

        /* バグる */ 
        // for (auto&& tmp_team : teams) {
        //     ll can_join = all_of(tmp_team.begin(), tmp_team.end(), [&](ll z) { return !not_friend[added][z]; });
        //     if (can_join) {
        //         tmp_team.push_back(added);
        //         self(self, added + 1);
        //         tmp_team.pop_back();
        //     }
        // }

        /* これならOK */ 
        for (ll i = 0; i < teams.size(); i++) {
            ll can_join = all_of(teams[i].begin(), teams[i].end(), [&](ll z) { return !not_friend[added][z]; });
            if (can_join) {
                teams[i].push_back(added);
                self(self, added + 1);
                teams[i].pop_back();
            }
        }

        teams.push_back({added});
        self(self, added + 1);
        teams.pop_back();
    };

    dfs(dfs, 0);

    cout << ans << endl;
}

int main() {
    cin.tie(nullptr), ios::sync_with_stdio(false), cout << fixed << setprecision(12);

    int testcase_size = 1;
    // cin >> testcase_size;

    for (int _t = 0; _t < testcase_size; _t++) {
        solve(_t);
    }
}