git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 0/8] add a test mode for SANITIZE=leak, run it in CI

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Sep 2, 2021, 12:25 UTC
Message-ID
<877dfzb0tw.fsf@evledraar.gmail.com>
In-Reply-To
<YS9OT/pn5rRK9cGB@coredump.intra.peff.net>
On Wed, Sep 01 2021, Jeff King wrote:
Show 15 quoted lines
> On Tue, Aug 31, 2021 at 03:35:34PM +0200, Ævar Arnfjörð Bjarmason wrote:
>
>>  * In v2 compiling with SANITIZE=leak would change things so only
>>    known-good passing tests were run by default, everything else would
>>    pass as a dummy. Now the default running of tests is unchanged, but
>>    if we run with GIT_TEST_PASSING_SANITIZE_LEAK=true only those tests
>>    are run which set and export TEST_PASSES_SANITIZE_LEAK=true.
>> 
>>  * The facility for declaring known-good tests in test-lib.sh based on
>>    wildcards is gone, instead individual tests need to declare if
>>    they're OK under SANITIZE=leak.[...]
>
> Hmm. This still seems more complicated than we need. If we just want a
> flag in each script, then test-lib.sh can use that flag to tweak
> LSAN_OPTIONS. See the patch below.

On the "pragma" include v.s. env var + export: I figured this would be easier to read as I thought the export was required (I don't think it is in most cases, but e.g. for t0000*.sh I think it is, but that's from memory...).

Show 5 quoted lines
> That has two drawbacks:
>
>   - it doesn't have any way to switch the flag per-test. But IMHO it is
>     a mistake to go in that direction. This is all temporary scaffolding
>     while we have leaks, and the script-level of granularity is fine.

We have a lot of tests that do simple checking of the tool itself, and later in the script might be stressing trace2, or common sources of leaks like "git log" in combination with the tool (e.g. the commit-graph tests).

So being able to tweak this inside the script is useful, but that can of course also be done with this proposed TEST_LSAN_OK + prereq.

>   - it runs the tests not marked as LSAN-OK, just without leak checking,
>     which is redundant in CI where we're already running them. But we
>     could still be collecting leak stats (and just not failing the
>     tests). See the patch below.
Sure, I'd prefer 
>     If we do care about not running them, then I think it makes more
>     sense to extend the run/skip mechanisms and build on that.

The patch I have here is already nicely integrated with the skip mechanism. I.e. we use skip_all which shows a summary in any TAP consumer, and we can skip individual tests with prerequisites.

Show 8 quoted lines
>     (I also think I prefer the central list of "mark these scripts as OK
>     for leak-checking", rather than annotating individuals. Because
>     again, this is temporary, and it's nice to keep it in a sandbox that
>     only people working on leak-checking would look at or touch).
>
> I realize this is kind-of bikeshedding, and I'm not vehemently opposed
> to what you have here. It just seems like fewer moving parts would be
> less likely to confuse folks who want to poke at it.

I can see that for the proposed v2 mechanism, but in this v3 nothing changes unless you opt-in to things via new GIT_TEST_* setting. So the chance for confusion seems minimal to nonexisting.

I was interested in doing some summaries of existing leaks eventually. It seems even with LSAN_OPTIONS=detect_leaks=0 compiling with SANITIZE=leak make things a bit slower, but not by much (but actual leak checking is much slower).

But I'd prefer to leave any "write out leak logs and summarize" step for some later change.

Show 11 quoted lines
>>    This is done via "export
>>    TEST_PASSES_SANITIZE_LEAK=true", there's a handy import of
>>    "./test-pragma-SANITIZE=leak-ok.sh" before sourcing "./test-lib.sh"
>>    itself to set this.
>
> I found the extra level of indirection added by this pragma confusing.
> We just need to set a variable, which is also a one-liner, and one that
> is more obvious about what it's doing. In your code you also export it,
> but that's not necessary for something that test-lib.sh is going to look
> at. Or if it's really necessary at some point, then test-lib.sh can do
> the export itself.
*nod*, will remove it per discussion above.
Show 12 quoted lines
>> Ævar Arnfjörð Bjarmason (8):
>>   Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONS
>>   CI: refactor "if" to "case" statement
>>   tests: add a test mode for SANITIZE=leak, run it in CI
>>   tests: annotate t000*.sh with TEST_PASSES_SANITIZE_LEAK=true
>>   tests: annotate t001*.sh with TEST_PASSES_SANITIZE_LEAK=true
>>   tests: annotate t002*.sh with TEST_PASSES_SANITIZE_LEAK=true
>>   tests: annotate select t0*.sh with TEST_PASSES_SANITIZE_LEAK=true
>>   tests: annotate select t*.sh with TEST_PASSES_SANITIZE_LEAK=true
>
> Sort of a meta-question, but what's the plan for folks who add a new
> test to say t0000, and it reveals a leak in code they didn't touch?

Then CI will fail on this job. We'd have those same failures now (e.g. the mentioned current delta between master..seen), we just don't see them. Having visibility on them seems like an improvement.

> They'll get a CI failure (as will Junio if he picks up the patch), so
> somebody is going to have to deal with it. Do they fix it? Do they unset
> the "this script is OK" flag? Do they mark the individual test as
> non-lsan-ok?

I'd think they'd fix it, or make marking the regression as OK part of their re-roll, just like failures on master..seen now.

If you're getting at that we should start out this job as an FYI job that doesn't impact the CI run's overall status if it fails I think that would be OK as a start.

> I do like the idea of finding real regressions. But while the state of
> leak-checking is still so immature, I'm worried about this adding extra
> friction for developers. Especially if they get some spooky action at a
> distance caused by a leak in far-away code.

Yeah, ultimately this series is an implicit endorsement of us caring more than we do now.

I think this friction point is going to be mitigated a lot by the ability I've added to not just skip entire test scripts, but allow prereq skipping of some tests, early bailing out etc.

It allows you to say add a "git log" test at the end of some test that otherwise just uses some core API or a test tool and not have to throw the baby out with the bathwater in terms of disabling all existing leak checks there to make forward progress (or split up the entire test script).

> Anyway, here's LSAN_OPTIONS thing I was thinking of.

Thanks, that & your follow-up is very interesting. Can I assume this has your SOB? I'd like to add that redirect to fd 4 change to this series.

Show 50 quoted lines
> diff --git a/t/t0001-init.sh b/t/t0001-init.sh
> index df544bb321..b1da18955d 100755
> --- a/t/t0001-init.sh
> +++ b/t/t0001-init.sh
> @@ -2,6 +2,7 @@
>  
>  test_description='git init'
>  
> +TEST_LSAN_OK=1
>  . ./test-lib.sh
>  
>  check_config () {
> diff --git a/t/test-lib.sh b/t/test-lib.sh
> index abcfbed6d6..62627afeaf 100644
> --- a/t/test-lib.sh
> +++ b/t/test-lib.sh
> @@ -44,9 +44,30 @@ GIT_BUILD_DIR="$TEST_DIRECTORY"/..
>  : ${ASAN_OPTIONS=detect_leaks=0:abort_on_error=1}
>  export ASAN_OPTIONS
>  
> -# If LSAN is in effect we _do_ want leak checking, but we still
> -# want to abort so that we notice the problems.
> -: ${LSAN_OPTIONS=abort_on_error=1}
> +if test -n "$LSAN_OPTIONS"
> +then
> +	# Leave user-provided options alone.
> +	:
> +elif test -n "$TEST_LSAN_OK"
> +then
> +	# The test script has declared itself as LSAN-clean; turn on full leak
> +	# checking.
> +	LSAN_OPTIONS=abort_on_error=1
> +else
> +	# The test script has possible LSAN failures. Just disable
> +	# leak-checking entirely. Another option would be to log the failures
> +	# with:
> +	#
> +	#   LSAN_OPTIONS=exitcode=0:log_path=$TEST_DIRECTORY/lsan/out
> +	#
> +	# The results are rather confusing, though, as the logs are
> +	# per-process; you have no idea which one came from which test script.
> +	# Ideally we'd send them to descriptor 4 along with the rest of the
> +	# script log, but there's no LSAN_OPTION for that (recent versions of
> +	# libsanitizer do have a public function to do so, so we could hook it
> +	# ourselves via common-main).
> +	LSAN_OPTIONS=detect_leaks=0
> +fi
>  export LSAN_OPTIONS
>  
>  if test ! -f "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
Previous: Jeff KingNext: Jeff King
Message 55 of 125 in “UNLEAK(), leak checking in the default tests etc.”
  1. Ævar Arnfjörð BjarmasonJun 9, 2021
  2. Andrzej HuntJun 9, 2021
  3. Felipe ContrerasJun 9, 2021
  4. Jeff KingJun 10, 2021
  5. Ævar Arnfjörð BjarmasonJun 10, 2021
  6. Jeff KingJun 10, 2021
  7. Andrzej HuntJun 10, 2021
  8. Jeff KingJun 10, 2021
  9. Andrzej HuntJun 11, 2021
  10. SZEDER GáborJun 10, 2021
  11. 0/4 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Jul 14, 2021
  12. 1/4 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Jul 14, 2021
  13. Đoàn Trần Công DanhJul 14, 2021
  14. 2/4 SANITIZE tests: fix memory leaks in t13*config*, add to whitelistÆvar Arnfjörð Bjarmason, Jul 14, 2021
  15. 3/4 SANITIZE tests: fix memory leaks in t5701*, add to whitelistÆvar Arnfjörð Bjarmason, Jul 14, 2021
  16. 4/4 SANITIZE tests: fix leak in mailmap.cÆvar Arnfjörð Bjarmason, Jul 14, 2021
  17. Eric SunshineJul 14, 2021
  18. 0/4 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Jul 14, 2021
  19. 1/4 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Jul 14, 2021
  20. Andrzej HuntJul 14, 2021
  21. Ævar Arnfjörð BjarmasonJul 14, 2021
  22. Jeff KingJul 15, 2021
  23. Jeff KingJul 15, 2021
  24. Ævar Arnfjörð BjarmasonJul 16, 2021
  25. Jeff KingJul 16, 2021
  26. Jeff KingJul 16, 2021
  27. Ævar Arnfjörð BjarmasonJul 16, 2021
  28. Jeff KingJul 16, 2021
  29. 2/4 SANITIZE tests: fix memory leaks in t13*config*, add to whitelistÆvar Arnfjörð Bjarmason, Jul 14, 2021
  30. Andrzej HuntJul 14, 2021
  31. Ævar Arnfjörð BjarmasonJul 14, 2021
  32. Jeff KingJul 15, 2021
  33. Andrzej HuntJul 16, 2021
  34. Jeff KingJul 16, 2021
  35. Ævar Arnfjörð BjarmasonJul 16, 2021
  36. Jeff KingJul 16, 2021
  37. Ævar Arnfjörð BjarmasonAug 31, 2021
  38. Jeff KingSep 1, 2021
  39. Ævar Arnfjörð BjarmasonSep 1, 2021
  40. 3/4 SANITIZE tests: fix memory leaks in t5701*, add to whitelistÆvar Arnfjörð Bjarmason, Jul 14, 2021
  41. Andrzej HuntJul 15, 2021
  42. Jeff KingJul 15, 2021
  43. protocol-caps.c: fix memory leak in send_info()Ævar Arnfjörð Bjarmason, Aug 31, 2021
  44. Bruno AlbuquerqueAug 31, 2021
  45. Junio C HamanoAug 31, 2021
  46. 4/4 SANITIZE tests: fix leak in mailmap.cÆvar Arnfjörð Bjarmason, Jul 14, 2021
  47. mailmap.c: fix a memory leak in free_mailap_{info,entry}()Ævar Arnfjörð Bjarmason, Aug 31, 2021
  48. Eric SunshineAug 31, 2021
  49. Jeff KingAug 31, 2021
  50. Junio C HamanoAug 31, 2021
  51. Andrzej HuntJul 15, 2021
  52. 0/8 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Aug 31, 2021
  53. Jeff KingSep 1, 2021
  54. Jeff KingSep 1, 2021
  55. Ævar Arnfjörð BjarmasonSep 2, 2021
  56. Jeff KingSep 3, 2021
  57. 0/3 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 7, 2021
  58. 1/3 Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONSÆvar Arnfjörð Bjarmason, Sep 7, 2021
  59. 2/3 CI: refactor "if" to "case" statementÆvar Arnfjörð Bjarmason, Sep 7, 2021
  60. 3/3 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 7, 2021
  61. Eric SunshineSep 7, 2021
  62. Jeff KingSep 7, 2021
  63. Jeff KingSep 7, 2021
  64. Junio C HamanoSep 7, 2021
  65. 0/3 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 7, 2021
  66. 1/3 Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONSÆvar Arnfjörð Bjarmason, Sep 7, 2021
  67. 2/3 CI: refactor "if" to "case" statementÆvar Arnfjörð Bjarmason, Sep 7, 2021
  68. 3/3 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 7, 2021
  69. Eric SunshineSep 8, 2021
  70. fixup! tests: add a test mode for SANITIZE=leak, run it in CICarlo Marcelo Arenas Belón, Sep 16, 2021
  71. Ævar Arnfjörð BjarmasonSep 16, 2021
  72. Junio C HamanoSep 8, 2021
  73. Ævar Arnfjörð BjarmasonSep 8, 2021
  74. Emily ShafferSep 9, 2021
  75. 0/2 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 16, 2021
  76. 1/2 Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONSÆvar Arnfjörð Bjarmason, Sep 16, 2021
  77. 2/2 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 16, 2021
  78. 0/2 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 19, 2021
  79. 2/2 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 19, 2021
  80. fixup! tests: add a test mode for SANITIZE=leak, run it in CICarlo Marcelo Arenas Belón, Sep 22, 2021
  81. Ævar Arnfjörð BjarmasonSep 23, 2021
  82. 1/2 Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONSÆvar Arnfjörð Bjarmason, Sep 19, 2021
  83. 0/2 add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 23, 2021
  84. 1/2 Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONSÆvar Arnfjörð Bjarmason, Sep 23, 2021
  85. 2/2 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Sep 23, 2021
  86. Re* [PATCH v8 2/2] tests: add a test mode for SANITIZE=leak, run it in CIJunio C Hamano, Nov 3, 2021
  87. Junio C HamanoNov 3, 2021
  88. Ævar Arnfjörð BjarmasonNov 4, 2021
  89. t0006: date_mode can leak .strftime_fmt memberÆvar Arnfjörð Bjarmason, Nov 16, 2021
  90. Junio C HamanoNov 16, 2021
  91. Jeff KingNov 16, 2021
  92. 0/5 date.[ch] API: split from cache.h, add API docs, stop leaking memoryÆvar Arnfjörð Bjarmason, Feb 2, 2022
  93. 1/5 cache.h: remove always unused show_date_human() declarationÆvar Arnfjörð Bjarmason, Feb 2, 2022
  94. 2/5 date API: create a date.h, split from cache.hÆvar Arnfjörð Bjarmason, Feb 2, 2022
  95. Ævar Arnfjörð BjarmasonFeb 2, 2022
  96. Junio C HamanoFeb 15, 2022
  97. 3/5 date API: provide and use a DATE_MODE_INITÆvar Arnfjörð Bjarmason, Feb 2, 2022
  98. 4/5 date API: add basic API docsÆvar Arnfjörð Bjarmason, Feb 2, 2022
  99. Junio C HamanoFeb 15, 2022
  100. 5/5 date API: add and use a date_mode_release()Ævar Arnfjörð Bjarmason, Feb 2, 2022
  101. Junio C HamanoFeb 15, 2022
  102. 0/5 date.[ch] API: split from cache.h, add API docs, stop leaking memoryÆvar Arnfjörð Bjarmason, Feb 4, 2022
  103. 1/5 cache.h: remove always unused show_date_human() declarationÆvar Arnfjörð Bjarmason, Feb 4, 2022
  104. 2/5 date API: create a date.h, split from cache.hÆvar Arnfjörð Bjarmason, Feb 4, 2022
  105. 3/5 date API: provide and use a DATE_MODE_INITÆvar Arnfjörð Bjarmason, Feb 4, 2022
  106. 4/5 date API: add basic API docsÆvar Arnfjörð Bjarmason, Feb 4, 2022
  107. 5/5 date API: add and use a date_mode_release()Ævar Arnfjörð Bjarmason, Feb 4, 2022
  108. Ævar Arnfjörð BjarmasonFeb 14, 2022
  109. Junio C HamanoFeb 14, 2022
  110. 0/5 date.[ch] API: split from cache.h, add API docs, stop leaking memoryÆvar Arnfjörð Bjarmason, Feb 16, 2022
  111. 1/5 cache.h: remove always unused show_date_human() declarationÆvar Arnfjörð Bjarmason, Feb 16, 2022
  112. 2/5 date API: create a date.h, split from cache.hÆvar Arnfjörð Bjarmason, Feb 16, 2022
  113. 3/5 date API: provide and use a DATE_MODE_INITÆvar Arnfjörð Bjarmason, Feb 16, 2022
  114. 4/5 date API: add basic API docsÆvar Arnfjörð Bjarmason, Feb 16, 2022
  115. 5/5 date API: add and use a date_mode_release()Ævar Arnfjörð Bjarmason, Feb 16, 2022
  116. Junio C HamanoFeb 16, 2022
  117. 1/8 Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONSÆvar Arnfjörð Bjarmason, Aug 31, 2021
  118. 2/8 CI: refactor "if" to "case" statementÆvar Arnfjörð Bjarmason, Aug 31, 2021
  119. 3/8 tests: add a test mode for SANITIZE=leak, run it in CIÆvar Arnfjörð Bjarmason, Aug 31, 2021
  120. 4/8 tests: annotate t000*.sh with TEST_PASSES_SANITIZE_LEAK=trueÆvar Arnfjörð Bjarmason, Aug 31, 2021
  121. 5/8 tests: annotate t001*.sh with TEST_PASSES_SANITIZE_LEAK=trueÆvar Arnfjörð Bjarmason, Aug 31, 2021
  122. 6/8 tests: annotate t002*.sh with TEST_PASSES_SANITIZE_LEAK=trueÆvar Arnfjörð Bjarmason, Aug 31, 2021
  123. 7/8 tests: annotate select t0*.sh with TEST_PASSES_SANITIZE_LEAK=trueÆvar Arnfjörð Bjarmason, Aug 31, 2021
  124. 8/8 tests: annotate select t*.sh with TEST_PASSES_SANITIZE_LEAK=trueÆvar Arnfjörð Bjarmason, Aug 31, 2021
  125. Ævar Arnfjörð BjarmasonAug 31, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.