Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crash in homebrew fmt 11.1.0 from homebrew ccache 4.10.2 #4278

Closed
ADKaster opened this issue Dec 26, 2024 · 8 comments
Closed

Crash in homebrew fmt 11.1.0 from homebrew ccache 4.10.2 #4278

ADKaster opened this issue Dec 26, 2024 · 8 comments

Comments

@ADKaster
Copy link

This appears to be an ABI break(?) or at least difference between fmt 11.0.2 and 11.1.0.

Feel free to close this if it's entirely homebrew's fault though :)

With older homebrew's build of 11.0.2, this issue does not reproduce.

However, on current latest versions, I see the following behavior:

ccache --version: 👍
ccahe --help : 💥

Here's the brew issue I opened: https://github.com/orgs/Homebrew/discussions/5830

And the backtrace:

$ lldb ccache
(lldb) target create "ccache"
Current executable set to '/opt/homebrew/bin/ccache' (arm64).
(lldb) run --help
Process 85982 launched: '/opt/homebrew/bin/ccache' (arm64)
Process 85982 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
    frame #0: 0x000000010000e350 ccache`fmt::v11::basic_appender<char> fmt::v11::detail::write_padded<char, (fmt::v11::align::type)1, fmt::v11::basic_appender<char>, fmt::v11::basic_appender<char> fmt::v11::detail::write<char, fmt::v11::basic_appender<char>>(fmt::v11::basic_appender<char>, fmt::v11::basic_string_view<char>, fmt::v11::format_specs const&)::'lambda'(fmt::v11::basic_appender<char>)>(fmt::v11::basic_appender<char>, fmt::v11::format_specs const&, unsigned long, unsigned long, fmt::v11::basic_appender<char> fmt::v11::detail::write<char, fmt::v11::basic_appender<char>>(fmt::v11::basic_appender<char>, fmt::v11::basic_string_view<char>, fmt::v11::format_specs const&)::'lambda'(fmt::v11::basic_appender<char>)&&) + 64
ccache`fmt::v11::detail::write_padded<char, (fmt::v11::align::type)1, fmt::v11::basic_appender<char>, fmt::v11::basic_appender<char> fmt::v11::detail::write<char, fmt::v11::basic_appender<char>>(fmt::v11::basic_appender<char>, fmt::v11::basic_string_view<char>, fmt::v11::format_specs const&)::'lambda'(fmt::v11::basic_appender<char>)>:
->  0x10000e350 <+64>: ldp    x8, x9, [x0, #0x8]
    0x10000e354 <+68>: add    x8, x8, x2
    0x10000e358 <+72>: add    x21, x1, #0xb
    0x10000e35c <+76>: ldrb   w10, [x1, #0xf]
Target 0: (ccache) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
  * frame #0: 0x000000010000e350 ccache`fmt::v11::basic_appender<char> fmt::v11::detail::write_padded<char, (fmt::v11::align::type)1, fmt::v11::basic_appender<char>, fmt::v11::basic_appender<char> fmt::v11::detail::write<char, fmt::v11::basic_appender<char>>(fmt::v11::basic_appender<char>, fmt::v11::basic_string_view<char>, fmt::v11::format_specs const&)::'lambda'(fmt::v11::basic_appender<char>)>(fmt::v11::basic_appender<char>, fmt::v11::format_specs const&, unsigned long, unsigned long, fmt::v11::basic_appender<char> fmt::v11::detail::write<char, fmt::v11::basic_appender<char>>(fmt::v11::basic_appender<char>, fmt::v11::basic_string_view<char>, fmt::v11::format_specs const&)::'lambda'(fmt::v11::basic_appender<char>)&&) + 64
    frame #1: 0x000000010000e274 ccache`fmt::v11::basic_appender<char> fmt::v11::detail::write<char, fmt::v11::basic_appender<char>>(fmt::v11::basic_appender<char>, fmt::v11::basic_string_view<char>, fmt::v11::format_specs const&) + 232
    frame #2: 0x000000010000d7a8 ccache`auto fmt::v11::formatter<std::__1::__fs::filesystem::path, char, void>::format<fmt::v11::context>(std::__1::__fs::filesystem::path const&, fmt::v11::context&) const + 108
    frame #3: 0x000000010000d6fc ccache`void fmt::v11::detail::value<fmt::v11::context>::format_custom_arg<std::__1::__fs::filesystem::path, fmt::v11::formatter<std::__1::__fs::filesystem::path, char, void>>(void*, fmt::v11::basic_format_parse_context<char>&, fmt::v11::context&) + 112
    frame #4: 0x000000010018b39c libfmt.11.dylib`void fmt::v11::detail::parse_format_string<char, fmt::v11::detail::format_handler<char>>(fmt::v11::basic_string_view<char>, fmt::v11::detail::format_handler<char>&&) + 1264
    frame #5: 0x000000010018ac64 libfmt.11.dylib`fmt::v11::detail::vformat_to(fmt::v11::detail::buffer<char>&, fmt::v11::basic_string_view<char>, fmt::v11::basic_format_args<fmt::v11::context>, fmt::v11::detail::locale_ref) + 76
    frame #6: 0x000000010018b62c libfmt.11.dylib`fmt::v11::vprint(__sFILE*, fmt::v11::basic_string_view<char>, fmt::v11::basic_format_args<fmt::v11::context>) + 84
    frame #7: 0x000000010004be88 ccache`core::process_main_options(int, char const* const*) + 4116
    frame #8: 0x0000000100021a9c ccache`ccache_main(int, char const* const*) + 144
    frame #9: 0x0000000195210274 dyld`start + 2840

This appears to be an issue upgrading from 11.0.2 to 11.1.0, which feels unexpected from fmtlib's perspective.

fmt info

$ brew info fmt
==> fmt: stable 11.1.0 (bottled), HEAD
Open-source formatting library for C++
https://fmt.dev/
Installed
/opt/homebrew/Cellar/fmt/11.1.0 (29 files, 1MB) *
  Poured from bottle using the formulae.brew.sh API on 2024-12-26 at 09:32:49
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/f/fmt.rb
License: MIT
==> Dependencies
Build: cmake ✔
==> Options
--HEAD
	Install HEAD version
==> Analytics
install: 18,699 (30 days), 61,427 (90 days), 237,794 (365 days)
install-on-request: 634 (30 days), 3,807 (90 days), 14,685 (365 days)
build-error: 0 (30 days)
@phprus
Copy link
Contributor

phprus commented Dec 26, 2024

@vitaut

It looks like class context has changed ABI:

4fa533c#diff-1441eec7746106c0c58dbb3a207f93cd1cec6d991e4d40b0056b1ad7f5930f58L2764

@vitaut
Copy link
Contributor

vitaut commented Dec 26, 2024

Thanks for reporting! I managed to repro the issue and here's a tentative fix: 3e04222. @ADKaster, could you confirm that it fixes the problem?

@ADKaster
Copy link
Author

@vitaut yes, your commit fixes the issue on my machine.

After configuring with cmake -GNinja -DBUILD_SHARED_LIBS=ON -Bbuild and building the project, the following test now works:

andrew@Andrews-MacBook-Pro-2:~/Source/fmt$ git rev-parse HEAD
3e04222d53e683f60a4ad79016a9c6d82186bbb5
andrew@Andrews-MacBook-Pro-2:~/Source/fmt$  ccache --help
Segmentation fault: 11
andrew@Andrews-MacBook-Pro-2:~/Source/fmt$ DYLD_LIBRARY_PATH=$PWD/build ccache --help
Usage:
    ccache [ccache options]
    ccache [KEY=VALUE ...] compiler [compiler options]
    compiler [compiler options]

    The first form takes options described below. The second form invokes the
    compiler, optionally using configuration options from KEY=VALUE arguments.
    In the third form, ccache is masquerading as the compiler.

@ADKaster
Copy link
Author

Note that homebrew did up-rev their ccache package: Homebrew/homebrew-core#202493

@vitaut
Copy link
Contributor

vitaut commented Dec 26, 2024

Thanks for checking! I've merged the fix and will put together a corrective release. Thanks, @phprus, for investigating this as well.

@vitaut vitaut closed this as completed Dec 26, 2024
@phprus
Copy link
Contributor

phprus commented Dec 26, 2024

@vitaut
The absence of FMT_NO_UNIQUE_ADDRESS will not affect the ABI?

@vitaut
Copy link
Contributor

vitaut commented Dec 26, 2024

The absence of FMT_NO_UNIQUE_ADDRESS will not affect the ABI?

Good catch, re-added in feb7212.

@vitaut
Copy link
Contributor

vitaut commented Dec 27, 2024

maschwenk added a commit to maschwenk/homebrew-core that referenced this issue Dec 27, 2024
`watchman` appears broken because of a regression in `fmt` fmtlib/fmt#4278
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants