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
mtremer pushed a commit to ipfire/ipfire-2.x that referenced this issue Feb 22, 2025
- Update from version 11.0.2 to 11.1.3
- Update of rootfile
- Changelog
    11.1.3
	- Fixed compilation on GCC 9.4 (fmtlib/fmt#4313).
	- Worked around an internal compiler error when using C++20 modules with GCC
	  14.2 and earlier (fmtlib/fmt#4295).
	- Worked around a bug in GCC 6 (fmtlib/fmt#4318).
	- Fixed an issue caused by instantiating `formatter<const T>`
	  (fmtlib/fmt#4303,
	  fmtlib/fmt#4325). Thanks @timsong-cpp.
	- Fixed formatting into `std::ostreambuf_iterator` when using format string
	  compilation (fmtlib/fmt#4309,
	  fmtlib/fmt#4312). Thanks @phprus.
	- Restored a constraint on the map formatter so that it correctly reports as
	  unformattable when the element is (fmtlib/fmt#4326).
	  Thanks @timsong-cpp.
	- Reduced the size of format specs (fmtlib/fmt#4298).
	- Readded `args()` to `fmt::format_context`
	  (fmtlib/fmt#4307,
	  fmtlib/fmt#4310). Thanks @Erroneous1.
	- Fixed a bogus MSVC warning (fmtlib/fmt#4314,
	  fmtlib/fmt#4322). Thanks @ZehMatt.
	- Fixed a pedantic mode error in the CMake config
	  (fmtlib/fmt#4327). Thanks @rlalik.
    11.1.2
	- Fixed ABI compatibility with earlier 11.x versions
	  (fmtlib/fmt#4292).
	- Added `wchar_t` support to the `std::bitset` formatter
	  (fmtlib/fmt#4285,
	  fmtlib/fmt#4286,
	  fmtlib/fmt#4289,
	  fmtlib/fmt#4290). Thanks @phprus.
	- Prefixed CMake components with `fmt-` to simplify usage of {fmt} via
	  `add_subdirectory` (fmtlib/fmt#4283).
	- Updated docs for meson (fmtlib/fmt#4291).
	  Thanks @trim21.
	- Fixed a compilation error in chrono on nvcc
	  (fmtlib/fmt#4297,
	  fmtlib/fmt#4301). Thanks @breyerml.
	- Fixed various warnings
	  (fmtlib/fmt#4288,
	  fmtlib/fmt#4299). Thanks @GamesTrap and @edo9300.
    11.1.1
	- Fixed ABI compatibility with earlier 11.x versions
	  (fmtlib/fmt#4278).
	- Defined CMake components (`core` and `doc`) to allow docs to be installed
	  separately (fmtlib/fmt#4276).
	  Thanks @carlsmedstad.
    11.1.0
	- Improved C++20 module support
	  (fmtlib/fmt#4081,
	  fmtlib/fmt#4083,
	  fmtlib/fmt#4084,
	  fmtlib/fmt#4152,
	  fmtlib/fmt#4153,
	  fmtlib/fmt#4169,
	  fmtlib/fmt#4190,
	  fmtlib/fmt#4234,
	  fmtlib/fmt#4239).
	  Thanks @kamrann and @Arghnews.
	- Reduced debug (unoptimized) binary code size and the number of template
	  instantiations when passing formatting arguments. For example, unoptimized
	  binary code size for `fmt::print("{}", 42)` was reduced by ~40% on GCC and
	  ~60% on clang (x86-64).
	  GCC:
	  - Before: 161 instructions of which 105 are in reusable functions
	    ([godbolt](https://www.godbolt.org/z/s9bGoo4ze)).
	  - After: 116 instructions of which 60 are in reusable functions
	    ([godbolt](https://www.godbolt.org/z/r7GGGxMs6)).
	  Clang:
	  - Before: 310 instructions of which 251 are in reusable functions
	    ([godbolt](https://www.godbolt.org/z/Ts88b7M9o)).
	  - After: 194 instructions of which 135 are in reusable functions
	    ([godbolt](https://www.godbolt.org/z/vcrjP8ceW)).
	- Added an experimental `fmt::writer` API that can be used for writing to
	  different destinations such as files or strings
	  (fmtlib/fmt#2354).
	  For example ([godbolt](https://www.godbolt.org/z/rWoKfbP7e)):
		  ```c++
		  #include <fmt/os.h>
		  void write_text(fmt::writer w) {
		    w.print("The answer is {}.", 42);
		  }
		  int main() {
		    // Write to FILE.
		    write_text(stdout);
		    // Write to fmt::ostream.
		    auto f = fmt::output_file("myfile");
		    write_text(f);
		    // Write to std::string.
		    auto sb = fmt::string_buffer();
		    write_text(sb);
		    std::string s = sb.str();
		  }
		  ```
	- Added width and alignment support to the formatter of `std::error_code`.
	- Made `std::expected<void, E>` formattable
	  (fmtlib/fmt#4145,
	  fmtlib/fmt#4148).
	  For example ([godbolt](https://www.godbolt.org/z/hrj5c6G86)):
		  ```c++
		  fmt::print("{}", std::expected<void, int>());
		  ```
		  prints
		  ```
		  expected()
		  ```
	  Thanks @phprus.
	- Made `fmt::is_formattable<void>` SFINAE-friendly
	  (fmtlib/fmt#4147).
	- Added support for `_BitInt` formatting when using clang
	  (fmtlib/fmt#4007,
	  fmtlib/fmt#4072,
	  fmtlib/fmt#4140,
	  fmtlib/fmt#4173,
	  fmtlib/fmt#4176).
	  For example ([godbolt](https://www.godbolt.org/z/KWjbWec5z)):
		  ```c++
		  using int42 = _BitInt(42);
		  fmt::print("{}", int42(100));
		  ```
	  Thanks @Arghnews.
	- Added the `n` specifier for tuples and pairs
	  (fmtlib/fmt#4107). Thanks @someonewithpc.
	- Added support for tuple-like types to `fmt::join`
	  (fmtlib/fmt#4226,
	  fmtlib/fmt#4230). Thanks @phprus.
	- Made more types formattable at compile time
	  (fmtlib/fmt#4127). Thanks @AnthonyVH.
	- Implemented a more efficient compile-time `fmt::formatted_size`
	  (fmtlib/fmt#4102,
	  fmtlib/fmt#4103). Thanks @phprus.
	- Fixed compile-time formatting of some string types
	  (fmtlib/fmt#4065). Thanks @torshepherd.
	- Made compiled version of `fmt::format_to` work with
	  `std::back_insert_iterator<std::vector<char>>`
	  (fmtlib/fmt#4206,
	  fmtlib/fmt#4211). Thanks @phprus.
	- Added a formatter for `std::reference_wrapper`
	  (fmtlib/fmt#4163,
	  fmtlib/fmt#4164). Thanks @yfeldblum and @phprus.
	- Added experimental padding support (glibc `strftime` extension) to `%m`, `%j`
	  and `%Y` (fmtlib/fmt#4161). Thanks @KKhanhH.
	- Made microseconds formatted as `us` instead of `µs` if the Unicode support is
	  disabled (fmtlib/fmt#4088).
	- Fixed an unreleased regression in transcoding of surrogate pairs
	  (fmtlib/fmt#4094,
	  fmtlib/fmt#4095). Thanks @phprus.
	- Made `fmt::appender` satisfy `std::output_iterator` concept
	  (fmtlib/fmt#4092,
	  fmtlib/fmt#4093). Thanks @phprus.
	- Made `std::iterator_traits<fmt::appender>` standard-conforming
	  (fmtlib/fmt#4185). Thanks @CaseyCarter.
	- Made it easier to reuse `fmt::formatter<std::string_view>` for types with
	  an implicit conversion to `std::string_view`
	  (fmtlib/fmt#4036,
	  fmtlib/fmt#4055). Thanks @Arghnews.
	- Made it possible to disable `<filesystem>` use via `FMT_CPP_LIB_FILESYSTEM`
	  for compatibility with some video game console SDKs, e.g. Nintendo Switch SDK
	  (fmtlib/fmt#4257,
	  fmtlib/fmt#4258,
	  fmtlib/fmt#4259). Thanks @W4RH4WK and @phprus.
	- Fixed compatibility with platforms that use 80-bit `long double`
	  (fmtlib/fmt#4245,
	  fmtlib/fmt#4246). Thanks @jsirpoma.
	- Added support for UTF-32 code units greater than `0xFFFF` in fill
	  (fmtlib/fmt#4201).
	- Fixed handling of legacy encodings on Windows with GCC
	  (fmtlib/fmt#4162).
	- Made `fmt::to_string` take `fmt::basic_memory_buffer` by const reference
	  (fmtlib/fmt#4261,
	  fmtlib/fmt#4262). Thanks @sascha-devel.
	- Added `fmt::dynamic_format_arg_store::size`
	  (fmtlib/fmt#4270). Thanks @hannes-harnisch.
	- Removed the ability to control locale usage via an undocumented
	  `FMT_STATIC_THOUSANDS_SEPARATOR` in favor of `FMT_USE_LOCALE`.
	- Renamed `FMT_EXCEPTIONS` to `FMT_USE_EXCEPTIONS` for consistency with other
	  similar macros.
	- Improved include directory ordering to reduce the chance of including
	  incorrect headers when using multiple versions of {fmt}
	  (fmtlib/fmt#4116). Thanks @cdzhan.
	- Made it possible to compile a subset of {fmt} without the C++ runtime.
	- Improved documentation and README
	  (fmtlib/fmt#4066,
	  fmtlib/fmt#4117,
	  fmtlib/fmt#4203,
	  fmtlib/fmt#4235). Thanks @zyctree and @nikola-sh.
	- Improved the documentation generator (fmtlib/fmt#4110,
	  fmtlib/fmt#4115). Thanks @rturrado.
	- Improved CI (fmtlib/fmt#4155,
	  fmtlib/fmt#4151). Thanks @phprus.
	- Fixed various warnings and compilation issues
	  (fmtlib/fmt#2708,
	  fmtlib/fmt#4091,
	  fmtlib/fmt#4109,
	  fmtlib/fmt#4113,
	  fmtlib/fmt#4125,
	  fmtlib/fmt#4129,
	  fmtlib/fmt#4130,
	  fmtlib/fmt#4131,
	  fmtlib/fmt#4132,
	  fmtlib/fmt#4133,
	  fmtlib/fmt#4144,
	  fmtlib/fmt#4150,
	  fmtlib/fmt#4158,
	  fmtlib/fmt#4159,
	  fmtlib/fmt#4160,
	  fmtlib/fmt#4170,
	  fmtlib/fmt#4177,
	  fmtlib/fmt#4187,
	  fmtlib/fmt#4188,
	  fmtlib/fmt#4194,
	  fmtlib/fmt#4200,
	  fmtlib/fmt#4205,
	  fmtlib/fmt#4207,
	  fmtlib/fmt#4208,
	  fmtlib/fmt#4210,
	  fmtlib/fmt#4220,
	  fmtlib/fmt#4231,
	  fmtlib/fmt#4232,
	  fmtlib/fmt#4233,
	  fmtlib/fmt#4236,
	  fmtlib/fmt#4267,
	  fmtlib/fmt#4271).
	  Thanks @torsten48, @Arghnews, @tinfoilboy, @aminya, @Ottani, @zeroomega,
	  @c4v4, @kongy, @vinayyadav3016, @sergio-nsk, @phprus and @YexuanXiao.

Signed-off-by: Adolf Belka <[email protected]>
Signed-off-by: Michael Tremer <[email protected]>
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