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

Re: [PATCH] leak tests: free() before die for two API functions

From
Andrzej Hunt <andrzej@ahunt.org>
Date
Oct 21, 2021, 15:33 UTC
Message-ID
<FD837FF9-E83F-42AA-AC13-EADD161D20BE@ahunt.org>
In-Reply-To
<patch-1.1-5a47bf2e9c9-20211021T114223Z-avarab@gmail.com>
Show 7 quoted lines
> On 21 Oct 2021, at 13:42, Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
> 
> Call free() just before die() in two API functions whose tests are
> asserted under SANITIZE=leak. Normally this would not be needed due to
> how SANITIZE=leak works, but in these cases my GCC version (10.2.1-6)
> will fail tests t0001 and t0017 under SANITIZE=leak depending on the
> optimization level.
I’m curious - to me this seems like a compiler/sanitiser bug, can it also be reproduced with clang, or even newer versions of gcc? Similarly, can it be reproduced with your gcc version, using ASAN+LSAN (as opposed to LSAN by itself)? I remember seeing some false positives in the past for some permutations of compilers and sanitisers, but I’ve lost track of the details.
These kinds of fixes seem noisy if it’s just to work around what appears to be a bug (and to be philosophical: we wouldn’t want to do the same for all “leaks” up the call stack if a specific compiler complained about them after a die() - after all there will be many more allocations that didn’t get free’d floating around - so why is it OK for these “leaks”?)
If it this is a gcc-specific or LSAN-only-specific bug, I would suggest giving up on that combination for leak checking instead of adding such workarounds. After all the code seems correct - and while such compiler-specific workarounds are probably justified for user-visible bugs, these fixes seem to just be silencing a non-issue that only happens with what is probably a  “broken” setup?
(From what I can remember, I never saw these when running t00* using clang 11 or 12, always using LSAN+ASAN, but that was a while back. I’ve not spent much time using gcc.)
Show 51 quoted lines
> 
> See 956d2e4639b (tests: add a test mode for SANITIZE=leak, run it in
> CI, 2021-09-23) for the commit that marked t0017 for testing with
> SANITIZE=leak, and c150064dbe2 (leak tests: run various built-in tests
> in t00*.sh SANITIZE=leak, 2021-10-12) for t0001 (currently in "next").
> 
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> ---
> config.c | 4 +++-
> refs.c   | 5 ++++-
> 2 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/config.c b/config.c
> index 2dcbe901b6b..93979d39b21 100644
> --- a/config.c
> +++ b/config.c
> @@ -159,11 +159,13 @@ static int handle_path_include(const char *path, struct config_include_data *inc
>    }
> 
>    if (!access_or_die(path, R_OK, 0)) {
> -        if (++inc->depth > MAX_INCLUDE_DEPTH)
> +        if (++inc->depth > MAX_INCLUDE_DEPTH) {
> +            free(expanded);
>            die(_(include_depth_advice), MAX_INCLUDE_DEPTH, path,
>                !cf ? "<unknown>" :
>                cf->name ? cf->name :
>                "the command line");
> +        }
>        ret = git_config_from_file(git_config_include, path, inc);
>        inc->depth--;
>    }
> diff --git a/refs.c b/refs.c
> index 7f019c2377e..52929286032 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -590,8 +590,11 @@ char *repo_default_branch_name(struct repository *r, int quiet)
>    }
> 
>    full_ref = xstrfmt("refs/heads/%s", ret);
> -    if (check_refname_format(full_ref, 0))
> +    if (check_refname_format(full_ref, 0)) {
> +        free(ret);
> +        free(full_ref);
>        die(_("invalid branch name: %s = %s"), config_display_key, ret);
> +    }
>    free(full_ref);
> 
>    return ret;
> -- 
> 2.33.1.1486.gb2bc4955b90
> 
Previous: Ævar Arnfjörð BjarmasonNext: Junio C Hamano
Message 2 of 26 in “leak tests: free() before die for two API functions”
  1. leak tests: free() before die for two API functionsÆvar Arnfjörð Bjarmason, Oct 21, 2021
  2. Andrzej HuntOct 21, 2021
  3. Junio C HamanoOct 21, 2021
  4. Martin ÅgrenOct 21, 2021
  5. 0/3 refs.c + config.c: plug memory leaksÆvar Arnfjörð Bjarmason, Oct 21, 2021
  6. 2/3 config.c: don't leak memory in handle_path_include()Ævar Arnfjörð Bjarmason, Oct 21, 2021
  7. Junio C HamanoOct 21, 2021
  8. Ævar Arnfjörð BjarmasonOct 22, 2021
  9. Junio C HamanoOct 22, 2021
  10. Ævar Arnfjörð BjarmasonOct 22, 2021
  11. 1/3 refs.c: make "repo_default_branch_name" static, remove xstrfmt()Ævar Arnfjörð Bjarmason, Oct 21, 2021
  12. Junio C HamanoOct 21, 2021
  13. 3/3 config.c: free(expanded) before die(), work around GCC oddityÆvar Arnfjörð Bjarmason, Oct 21, 2021
  14. Junio C HamanoOct 21, 2021
  15. 0/6 usage.c: add die_message() & plug memory leaks in refs.c & config.cÆvar Arnfjörð Bjarmason, Oct 22, 2021
  16. 1/6 usage.c: add a die_message() routineÆvar Arnfjörð Bjarmason, Oct 22, 2021
  17. Junio C HamanoOct 24, 2021
  18. 2/6 usage.c API users: use die_message() where appropriateÆvar Arnfjörð Bjarmason, Oct 22, 2021
  19. 3/6 usage.c + gc: add and use a die_message_errno()Ævar Arnfjörð Bjarmason, Oct 22, 2021
  20. Junio C HamanoOct 24, 2021
  21. 4/6 config.c: don't leak memory in handle_path_include()Ævar Arnfjörð Bjarmason, Oct 22, 2021
  22. Junio C HamanoOct 24, 2021
  23. 5/6 config.c: free(expanded) before die(), work around GCC oddityÆvar Arnfjörð Bjarmason, Oct 22, 2021
  24. Jeff KingOct 26, 2021
  25. 6/6 refs: plug memory leak in repo_default_branch_name()Ævar Arnfjörð Bjarmason, Oct 22, 2021
  26. Jonathan TanOct 27, 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.