{"thread":{"id":"58589","subject":"[PATCH] ci: add address and undefined sanitizer tasks","startedAt":"2022-10-09T23:20:27Z","lastAt":"2022-10-21T06:25:20Z","messageCount":9,"participants":["Junio C Hamano","Jeff King","Ævar Arnfjörð Bjarmason"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"464462","messageId":"xmqq8rlo62ih.fsf@gitster.g","threadId":"58589","inReplyTo":null,"subject":"[PATCH] ci: add address and undefined sanitizer tasks","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-10-09T22:44:22Z","receivedAt":"2022-10-09T23:20:27Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Signed-off-by: Junio C Hamano <gitster@pobox.com>\n---\n * I've been running my local post-integration-pre-pushout tests of\n   'seen' with these two sanitizer tests, which has saved me from a\n   few potential embarrassments early.  As it takes a lot extra time\n   to run these locally, I am aiming to burden contributors who run\n   their due diligence \"before sending the patch\" checks using the\n   GitHub Actions CI ;-).\n\n   The way the patch adds jobs to CI just imitates how -leaks one is\n   defined.\n\n .github/workflows/main.yml | 6 ++++++\n ci/lib.sh                  | 3 +++\n 2 files changed, 9 insertions(+)\n\ndiff --git a/.github/workflows/main.yml b/.github/workflows/main.yml\nindex 831f4df56c..2f80da7cfb 100644\n--- a/.github/workflows/main.yml\n+++ b/.github/workflows/main.yml\n@@ -251,6 +251,12 @@ jobs:\n           - jobname: linux-leaks\n             cc: gcc\n             pool: ubuntu-latest\n+          - jobname: linux-address\n+            cc: gcc\n+            pool: ubuntu-latest\n+          - jobname: linux-undefined\n+            cc: gcc\n+            pool: ubuntu-latest\n     env:\n       CC: ${{matrix.vector.cc}}\n       CC_PACKAGE: ${{matrix.vector.cc_package}}\ndiff --git a/ci/lib.sh b/ci/lib.sh\nindex 1b0cc2b57d..678edd5abb 100755\n--- a/ci/lib.sh\n+++ b/ci/lib.sh\n@@ -278,6 +278,9 @@ linux-leaks)\n \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n \t;;\n+linux-address | linux-undefined)\n+\texport SANITIZE=${jobname#linux-}\n+\t;;\n esac\n \n MAKEFLAGS=\"$MAKEFLAGS CC=${CC:-cc}\"\n-- \n2.38.0-167-gf9a88ca9e9\n\n"},{"id":"464543","messageId":"xmqqtu4bz2fw.fsf@gitster.g","threadId":"58589","inReplyTo":"xmqq8rlo62ih.fsf@gitster.g","subject":"Re: [PATCH] ci: add address and undefined sanitizer tasks","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-10-10T23:25:23Z","receivedAt":"2022-10-10T23:25:32Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Signed-off-by: Junio C Hamano <gitster@pobox.com>\n> ---\n>  * I've been running my local post-integration-pre-pushout tests of\n>    'seen' with these two sanitizer tests, which has saved me from a\n>    few potential embarrassments early.  As it takes a lot extra time\n>    to run these locally, I am aiming to burden contributors who run\n>    their due diligence \"before sending the patch\" checks using the\n>    GitHub Actions CI ;-).\n>\n>    The way the patch adds jobs to CI just imitates how -leaks one is\n>    defined.\n>\n>  .github/workflows/main.yml | 6 ++++++\n>  ci/lib.sh                  | 3 +++\n>  2 files changed, 9 insertions(+)\n\nOne downside is that the usual CI cycle for a branch that takes a\nbit shorter than 40 minutes seems to take between 50 to 60 minutes\n(the primary culprit seems to be the address sanitizer).\n\nArguably, that 10 or 20 minutes are time saved from human\ndevelopers' time, so it might not be too bad, but I'll keep\nit out of 'next' for now.\n\n> diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml\n> index 831f4df56c..2f80da7cfb 100644\n> --- a/.github/workflows/main.yml\n> +++ b/.github/workflows/main.yml\n> @@ -251,6 +251,12 @@ jobs:\n>            - jobname: linux-leaks\n>              cc: gcc\n>              pool: ubuntu-latest\n> +          - jobname: linux-address\n> +            cc: gcc\n> +            pool: ubuntu-latest\n> +          - jobname: linux-undefined\n> +            cc: gcc\n> +            pool: ubuntu-latest\n>      env:\n>        CC: ${{matrix.vector.cc}}\n>        CC_PACKAGE: ${{matrix.vector.cc_package}}\n> diff --git a/ci/lib.sh b/ci/lib.sh\n> index 1b0cc2b57d..678edd5abb 100755\n> --- a/ci/lib.sh\n> +++ b/ci/lib.sh\n> @@ -278,6 +278,9 @@ linux-leaks)\n>  \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n>  \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n>  \t;;\n> +linux-address | linux-undefined)\n> +\texport SANITIZE=${jobname#linux-}\n> +\t;;\n>  esac\n>  \n>  MAKEFLAGS=\"$MAKEFLAGS CC=${CC:-cc}\"\n"},{"id":"464546","messageId":"Y0SyH34tdXQK2qhA@coredump.intra.peff.net","threadId":"58589","inReplyTo":"xmqqtu4bz2fw.fsf@gitster.g","subject":"Re: [PATCH] ci: add address and undefined sanitizer tasks","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2022-10-11T00:00:31Z","receivedAt":"2022-10-11T00:00:43Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Mon, Oct 10, 2022 at 04:25:23PM -0700, Junio C Hamano wrote:\n\n> Junio C Hamano <gitster@pobox.com> writes:\n> \n> > Signed-off-by: Junio C Hamano <gitster@pobox.com>\n> > ---\n> >  * I've been running my local post-integration-pre-pushout tests of\n> >    'seen' with these two sanitizer tests, which has saved me from a\n> >    few potential embarrassments early.  As it takes a lot extra time\n> >    to run these locally, I am aiming to burden contributors who run\n> >    their due diligence \"before sending the patch\" checks using the\n> >    GitHub Actions CI ;-).\n> >\n> >    The way the patch adds jobs to CI just imitates how -leaks one is\n> >    defined.\n> \n> One downside is that the usual CI cycle for a branch that takes a\n> bit shorter than 40 minutes seems to take between 50 to 60 minutes\n> (the primary culprit seems to be the address sanitizer).\n> \n> Arguably, that 10 or 20 minutes are time saved from human\n> developers' time, so it might not be too bad, but I'll keep\n> it out of 'next' for now.\n\nYou can make it a bit faster by running both at once as\nSANITIZE=address,undefined.\n\nSince we expect both to pass cleanly, there's really no other\ncomplication; the user will either see errors (and correct them) or they\nwon't. The signal of \"passed with asan, but not ubsan\" (or vice versa)\nis not that useful in practice.\n\nIn the long run, I hope that \"leaks\" can run in the same way, but we're\nnot there yet since there's a lot of selective test-running. In theory\nthe regular linux test run is not necessary with this job, but I think\nthe signal for \"broke with/without sanitizers\" is a little higher (and\nanyway, we have to run the regular suite on a zillion other platforms,\ntoo).\n\n-Peff\n"},{"id":"464547","messageId":"xmqqy1tnxlu7.fsf@gitster.g","threadId":"58589","inReplyTo":"Y0SyH34tdXQK2qhA@coredump.intra.peff.net","subject":"Re: [PATCH] ci: add address and undefined sanitizer tasks","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-10-11T00:09:20Z","receivedAt":"2022-10-11T00:09:29Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> The signal of \"passed with asan, but not ubsan\" (or vice versa)\n> is not that useful in practice.\n\nAh, that may be true.  I'll try that in the next version.\n"},{"id":"464552","messageId":"xmqqpmezxl9p.fsf@gitster.g","threadId":"58589","inReplyTo":"xmqq8rlo62ih.fsf@gitster.g","subject":"[PATCH v2] ci: add address and undefined sanitizer tasks","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-10-11T00:21:38Z","receivedAt":"2022-10-11T00:21:43Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"The signal of \"passed with asan, but not ubsan\" (or vice versa) is\nnot that useful in practice, run both santizers in a single task.\n\nHelped-by: Jeff King <peff@peff.net>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\nRange-diff against v1:\n1:  04a9dc5439 ! 1:  cbf0d80ab1 ci: add address and undefined sanitizer tasks\n    @@ Metadata\n      ## Commit message ##\n         ci: add address and undefined sanitizer tasks\n     \n    +    The signal of \"passed with asan, but not ubsan\" (or vice versa) is\n    +    not that useful in practice, run both santizers in a single task.\n    +\n    +    Helped-by: Jeff King <peff@peff.net>\n         Signed-off-by: Junio C Hamano <gitster@pobox.com>\n     \n      ## .github/workflows/main.yml ##\n    @@ .github/workflows/main.yml: jobs:\n                - jobname: linux-leaks\n                  cc: gcc\n                  pool: ubuntu-latest\n    -+          - jobname: linux-address\n    -+            cc: gcc\n    -+            pool: ubuntu-latest\n    -+          - jobname: linux-undefined\n    ++          - jobname: linux-sanitize\n     +            cc: gcc\n     +            pool: ubuntu-latest\n          env:\n    @@ ci/lib.sh: linux-leaks)\n      \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n      \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n      \t;;\n    -+linux-address | linux-undefined)\n    -+\texport SANITIZE=${jobname#linux-}\n    ++linux-sanitize)\n    ++\texport SANITIZE=address,undefined\n     +\t;;\n      esac\n      \n\n .github/workflows/main.yml | 3 +++\n ci/lib.sh                  | 3 +++\n 2 files changed, 6 insertions(+)\n\ndiff --git a/.github/workflows/main.yml b/.github/workflows/main.yml\nindex 831f4df56c..92d27db0b9 100644\n--- a/.github/workflows/main.yml\n+++ b/.github/workflows/main.yml\n@@ -251,6 +251,9 @@ jobs:\n           - jobname: linux-leaks\n             cc: gcc\n             pool: ubuntu-latest\n+          - jobname: linux-sanitize\n+            cc: gcc\n+            pool: ubuntu-latest\n     env:\n       CC: ${{matrix.vector.cc}}\n       CC_PACKAGE: ${{matrix.vector.cc_package}}\ndiff --git a/ci/lib.sh b/ci/lib.sh\nindex 1b0cc2b57d..c9c4982e21 100755\n--- a/ci/lib.sh\n+++ b/ci/lib.sh\n@@ -278,6 +278,9 @@ linux-leaks)\n \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n \t;;\n+linux-sanitize)\n+\texport SANITIZE=address,undefined\n+\t;;\n esac\n \n MAKEFLAGS=\"$MAKEFLAGS CC=${CC:-cc}\"\n-- \n2.38.0-146-gaff07b31d7\n\n"},{"id":"464557","messageId":"Y0S4q/GBlTcK6Y1R@coredump.intra.peff.net","threadId":"58589","inReplyTo":"xmqqpmezxl9p.fsf@gitster.g","subject":"Re: [PATCH v2] ci: add address and undefined sanitizer tasks","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2022-10-11T00:28:27Z","receivedAt":"2022-10-11T00:28:40Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Mon, Oct 10, 2022 at 05:21:38PM -0700, Junio C Hamano wrote:\n\n> diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml\n> index 831f4df56c..92d27db0b9 100644\n> --- a/.github/workflows/main.yml\n> +++ b/.github/workflows/main.yml\n> @@ -251,6 +251,9 @@ jobs:\n>            - jobname: linux-leaks\n>              cc: gcc\n>              pool: ubuntu-latest\n> +          - jobname: linux-sanitize\n> +            cc: gcc\n> +            pool: ubuntu-latest\n>      env:\n>        CC: ${{matrix.vector.cc}}\n>        CC_PACKAGE: ${{matrix.vector.cc_package}}\n> diff --git a/ci/lib.sh b/ci/lib.sh\n> index 1b0cc2b57d..c9c4982e21 100755\n> --- a/ci/lib.sh\n> +++ b/ci/lib.sh\n> @@ -278,6 +278,9 @@ linux-leaks)\n>  \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n>  \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n>  \t;;\n> +linux-sanitize)\n> +\texport SANITIZE=address,undefined\n> +\t;;\n\nLooks fine to me (and I obviously endorse the goal :) ).\n\n-Peff\n"},{"id":"464593","messageId":"221011.86fsfupxx0.gmgdl@evledraar.gmail.com","threadId":"58589","inReplyTo":"xmqqpmezxl9p.fsf@gitster.g","subject":"Re: [PATCH v2] ci: add address and undefined sanitizer tasks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-10-11T08:23:31Z","receivedAt":"2022-10-11T08:28:09Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"\nOn Mon, Oct 10 2022, Junio C Hamano wrote:\n\n> The signal of \"passed with asan, but not ubsan\" (or vice versa) is\n> not that useful in practice, run both santizers in a single task.\n>\n> Helped-by: Jeff King <peff@peff.net>\n> Signed-off-by: Junio C Hamano <gitster@pobox.com>\n> ---\n> Range-diff against v1:\n> 1:  04a9dc5439 ! 1:  cbf0d80ab1 ci: add address and undefined sanitizer tasks\n>     @@ Metadata\n>       ## Commit message ##\n>          ci: add address and undefined sanitizer tasks\n>      \n>     +    The signal of \"passed with asan, but not ubsan\" (or vice versa) is\n>     +    not that useful in practice, run both santizers in a single task.\n>     +\n>     +    Helped-by: Jeff King <peff@peff.net>\n>          Signed-off-by: Junio C Hamano <gitster@pobox.com>\n>      \n>       ## .github/workflows/main.yml ##\n>     @@ .github/workflows/main.yml: jobs:\n>                 - jobname: linux-leaks\n>                   cc: gcc\n>                   pool: ubuntu-latest\n>     -+          - jobname: linux-address\n>     -+            cc: gcc\n>     -+            pool: ubuntu-latest\n>     -+          - jobname: linux-undefined\n>     ++          - jobname: linux-sanitize\n>      +            cc: gcc\n>      +            pool: ubuntu-latest\n>           env:\n>     @@ ci/lib.sh: linux-leaks)\n>       \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n>       \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n>       \t;;\n>     -+linux-address | linux-undefined)\n>     -+\texport SANITIZE=${jobname#linux-}\n>     ++linux-sanitize)\n>     ++\texport SANITIZE=address,undefined\n>      +\t;;\n>       esac\n>       \n>\n>  .github/workflows/main.yml | 3 +++\n>  ci/lib.sh                  | 3 +++\n>  2 files changed, 6 insertions(+)\n>\n> diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml\n> index 831f4df56c..92d27db0b9 100644\n> --- a/.github/workflows/main.yml\n> +++ b/.github/workflows/main.yml\n> @@ -251,6 +251,9 @@ jobs:\n>            - jobname: linux-leaks\n>              cc: gcc\n>              pool: ubuntu-latest\n> +          - jobname: linux-sanitize\n> +            cc: gcc\n> +            pool: ubuntu-latest\n>      env:\n>        CC: ${{matrix.vector.cc}}\n>        CC_PACKAGE: ${{matrix.vector.cc_package}}\n> diff --git a/ci/lib.sh b/ci/lib.sh\n> index 1b0cc2b57d..c9c4982e21 100755\n> --- a/ci/lib.sh\n> +++ b/ci/lib.sh\n> @@ -278,6 +278,9 @@ linux-leaks)\n>  \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n>  \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n>  \t;;\n> +linux-sanitize)\n> +\texport SANITIZE=address,undefined\n> +\t;;\n>  esac\n>  \n>  MAKEFLAGS=\"$MAKEFLAGS CC=${CC:-cc}\"\n\nThis LGTM, and all looks a bit familiar, even down to Jeff having the\nsame feedback on the v1:\nhttps://lore.kernel.org/git/patch-1.1-e48b6853dd5-20220726T110716Z-avarab@gmail.com/\n:)\n\nFWIW I had a re-roll ready for that, but was waiting for the dust to\nsettle on failures. As soon as we were SANITIZE=address clean (which 2x\ncommits broke in quick succession) we had the scalar SANITIZE=undefined\nfailure, and then the release.\n\nBut this works too. It's the same as what I've had queued up locally,\nexcept the job name is different, which was in response to other\nfeedback in the original thread:\n\nhttps://github.com/git/git/compare/master...avar:git:avar/ci-add-SANITIZE%3Daddress-and-SANITIZE%3Dundefined-2\n\n"},{"id":"465425","messageId":"xmqqtu3xogxr.fsf@gitster.g","threadId":"58589","inReplyTo":"Y0SyH34tdXQK2qhA@coredump.intra.peff.net","subject":"Re: [PATCH] ci: add address and undefined sanitizer tasks","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-10-21T05:59:28Z","receivedAt":"2022-10-21T05:59:38Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> You can make it a bit faster by running both at once as\n> SANITIZE=address,undefined.\n\nWith a single combined sanitier job, we saw failures at CI of p4\ntests, where the server \"goes away\" in the middle of tests, for\napparently no reason, and I just speculated perhaps the tests taking\ntoo long may be causing an impatient server side to go away before\nthe client side finishes its work or something.  After splitting the\nASan and UBSan jobs into two and ejecting a topic out of 'seen', CI\nstarted passing for the first time in several days.\n\nSo, here is what I ended up using, at least for now.\n\n----- >8 --------- >8 --------- >8 --------- >8 --------- >8 -----\nSubject: [PATCH] ci: add address and undefined sanitizer tasks\n\nThe current code is clean with these two sanitizers, and we would\nlike to keep it that way by running the checks for any new code.\n\nThe signal of \"passed with asan, but not ubsan\" (or vice versa) is\nnot that useful in practice, so it is tempting to run both santizers\nin a single task, but it seems to take forever, so tentatively let's\ntry having two separate ones.\n\nHelped-by: Jeff King <peff@peff.net>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n .github/workflows/main.yml | 6 ++++++\n ci/lib.sh                  | 6 ++++++\n 2 files changed, 12 insertions(+)\n\ndiff --git a/.github/workflows/main.yml b/.github/workflows/main.yml\nindex 831f4df56c..bd6f75b8e0 100644\n--- a/.github/workflows/main.yml\n+++ b/.github/workflows/main.yml\n@@ -251,6 +251,12 @@ jobs:\n           - jobname: linux-leaks\n             cc: gcc\n             pool: ubuntu-latest\n+          - jobname: linux-asan\n+            cc: gcc\n+            pool: ubuntu-latest\n+          - jobname: linux-ubsan\n+            cc: gcc\n+            pool: ubuntu-latest\n     env:\n       CC: ${{matrix.vector.cc}}\n       CC_PACKAGE: ${{matrix.vector.cc_package}}\ndiff --git a/ci/lib.sh b/ci/lib.sh\nindex 1b0cc2b57d..e3d49d3296 100755\n--- a/ci/lib.sh\n+++ b/ci/lib.sh\n@@ -278,6 +278,12 @@ linux-leaks)\n \texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n \texport GIT_TEST_SANITIZE_LEAK_LOG=true\n \t;;\n+linux-asan)\n+\texport SANITIZE=address\n+\t;;\n+linux-ubsan)\n+\texport SANITIZE=undefined\n+\t;;\n esac\n \n MAKEFLAGS=\"$MAKEFLAGS CC=${CC:-cc}\"\n-- \n2.38.1-312-ge3e2987aab\n"},{"id":"465429","messageId":"Y1I7SeRGikEtgx9t@coredump.intra.peff.net","threadId":"58589","inReplyTo":"xmqqtu3xogxr.fsf@gitster.g","subject":"Re: [PATCH] ci: add address and undefined sanitizer tasks","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2022-10-21T06:25:13Z","receivedAt":"2022-10-21T06:25:20Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, Oct 20, 2022 at 10:59:28PM -0700, Junio C Hamano wrote:\n\n> Jeff King <peff@peff.net> writes:\n> \n> > You can make it a bit faster by running both at once as\n> > SANITIZE=address,undefined.\n> \n> With a single combined sanitier job, we saw failures at CI of p4\n> tests, where the server \"goes away\" in the middle of tests, for\n> apparently no reason, and I just speculated perhaps the tests taking\n> too long may be causing an impatient server side to go away before\n> the client side finishes its work or something.  After splitting the\n> ASan and UBSan jobs into two and ejecting a topic out of 'seen', CI\n> started passing for the first time in several days.\n\nI am not too surprised to hear that. We flushed out many test races in\nthe past from using valgrind and SANITIZE. But I don't run the p4 tests\nlocally, so this is likely some of their first exposure to slower runs.\n\nBut if that is the case, then you are probably just papering over\nfailures here which will likely come back, at least racily.\n\nI admit I was surprised how much slower the combined one is. Here are a\nfew timings on my laptop:\n\n  $ for i in '' address undefined address,undefined; do\n      echo -n \"SANITIZE=$i\"\n      make SANITIZE=$i >/dev/null 2>&1 &&\n      (cd t && time ./t3700-add.sh >/dev/null 2>&1)\n      echo\n    done\n\n  SANITIZE=\n  real\t0m1.109s\n  user\t0m0.533s\n  sys\t0m0.589s\n  \n  SANITIZE=address\n  real\t0m1.816s\n  user\t0m0.999s\n  sys\t0m0.806s\n  \n  SANITIZE=undefined\n  real\t0m1.336s\n  user\t0m0.618s\n  sys\t0m0.710s\n\n  SANITIZE=address,undefined\n  real\t0m2.928s\n  user\t0m1.304s\n  sys\t0m1.635s\n\nCuriously, with CC=clang the results are closer to what I'd expect:\n\n  SANITIZE=\n  real\t0m1.186s\n  user\t0m0.608s\n  sys\t0m0.579s\n  \n  SANITIZE=address\n  real\t0m1.910s\n  user\t0m1.014s\n  sys\t0m0.890s\n  \n  SANITIZE=undefined\n  real\t0m1.477s\n  user\t0m0.611s\n  sys\t0m0.865s\n  \n  SANITIZE=address,undefined\n  real\t0m2.309s\n  user\t0m1.126s\n  sys\t0m1.191s\n\nI'm not sure what the takeaway is. If using two jobs produces\nappreciably fewer races in practice, it may be worth doing. But I wonder\nif just using clang would work better.\n\n-Peff\n"}]}