jank
jank copied to clipboard
ASan crash during compilation
I'm using the LLVM head to build jank with ASan enabled. I ran the following configuration command:
./bin/configure -GNinja -DCMAKE_BUILD_TYPE=Debug -Djank_test=on -Djank_sanitize=address
The summary for the configuration:
-- ┌─ jank options ─────────────────────
-- │ jank build type : Debug
-- │ jank version : jank-0.1-a14789789a3888abff3b857f3a0722f40e702776
-- │ jank tests : on
-- │ jank coverage : OFF
-- │ jank analyze : OFF
-- │ jank sanitize : address
-- │ jank unity build : OFF
-- │ jank resource dir : ../lib/jank/0.1
-- │ clang version : 22.0.0git
-- │ clang prefix : /opt/homebrew/Cellar/llvm/HEAD-17efa57
-- │ clang resource dir : /opt/homebrew/Cellar/llvm/HEAD-17efa57/lib/clang/22
-- └─────────────────────────────────────
The jank compilation fails with the following error:
$ ./bin/test
[391/417] Linking CXX executable jank-phase-1
ld: warning: reexported library with install name '/opt/homebrew/opt/llvm/lib/unwind/libunwind.1.dylib' found at '/opt/homebrew/Cellar/llvm/HEAD-17efa57/lib/unwind/libunwind.1.0.dylib' couldn't be matched with any parent library and will be linked directly
[393/417] Generating classes/core-libraries
FAILED: [code=134] classes/core-libraries core-libs/clojure/core.o /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/classes/core-libraries /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/core-libs/clojure/core.o
cd /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build && /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1 compile-module -o /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/core-libs/clojure/core.o clojure.core && touch /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/classes/core-libraries
=================================================================
==75284==ERROR: AddressSanitizer: container-overflow on address 0x602000001150 at pc 0x000108012cbc bp 0x00016d5aedd0 sp 0x00016d5ae580
READ of size 16 at 0x602000001150 thread T0
#0 0x000108012cb8 in memcpy+0x4c0 (libclang_rt.asan_osx_dynamic.dylib:arm64+0x52cb8)
#1 0x000102cbaf74 in char const** std::__1::__constexpr_memmove[abi:nn220000]<char const*, char const*>(char const**, char const**, std::__1::__element_count)+0x30 (jank-phase-1:arm64+0x10046ef74)
#2 0x000102cbaf08 in std::__1::pair<char const**, char const**> std::__1::__copy_trivial_impl[abi:nn220000]<char const*, char const*>(char const**, char const**, char const**)+0x44 (jank-phase-1:arm64+0x10046ef08)
#3 0x000102cbae78 in std::__1::pair<char const**, char const**> std::__1::__copy_impl::operator()[abi:nn220000]<char const*, char const*, 0>(char const**, char const**, char const**) const+0x28 (jank-phase-1:arm64+0x10046ee78)
#4 0x000102cbad90 in std::__1::pair<char const**, char const**> std::__1::__copy_move_unwrap_iters[abi:nn220000]<std::__1::__copy_impl, char const**, char const**, char const**, 0>(char const**, char const**, char const**)+0x54 (jank-phase-1:arm64+0x10046ed90)
#5 0x000102cbad1c in std::__1::pair<char const**, char const**> std::__1::__copy[abi:nn220000]<char const**, char const**, char const**>(char const**, char const**, char const**)+0x24 (jank-phase-1:arm64+0x10046ed1c)
#6 0x000102cbacdc in char const** std::__1::copy[abi:nn220000]<char const**, char const**>(char const**, char const**, char const**)+0x24 (jank-phase-1:arm64+0x10046ecdc)
#7 0x000102cbab2c in char const** std::__1::__uninitialized_allocator_copy_impl[abi:nn220000]<std::__1::allocator<char const*>, char const*, char const*, 0>(std::__1::allocator<char const*>&, char const**, char const**, char const**)+0x28 (jank-phase-1:arm64+0x10046eb2c)
#8 0x000102cbb6f8 in char const** std::__1::__uninitialized_allocator_copy[abi:nn220000]<std::__1::allocator<char const*>, char const**, char const**, char const**>(std::__1::allocator<char const*>&, char const**, char const**, char const**)+0x60 (jank-phase-1:arm64+0x10046f6f8)
#9 0x000102cbb53c in void std::__1::vector<char const*, std::__1::allocator<char const*>>::__construct_at_end<char const**, char const**>(char const**, char const**, unsigned long)+0x48 (jank-phase-1:arm64+0x10046f53c)
#10 0x000102f68124 in void std::__1::vector<char const*, std::__1::allocator<char const*>>::__init_with_size[abi:ne220000]<char const**, char const**>(char const**, char const**, unsigned long)+0x198 (jank-phase-1:arm64+0x10071c124)
#11 0x000102f67f68 in std::__1::vector<char const*, std::__1::allocator<char const*>>::vector[abi:ne220000](std::__1::vector<char const*, std::__1::allocator<char const*>> const&)+0x14c (jank-phase-1:arm64+0x10071bf68)
#12 0x000102f677a8 in std::__1::vector<char const*, std::__1::allocator<char const*>>::vector[abi:ne220000](std::__1::vector<char const*, std::__1::allocator<char const*>> const&)+0x20 (jank-phase-1:arm64+0x10071b7a8)
#13 0x000102f6748c in CLI::IsMember::IsMember<std::__1::vector<char const*, std::__1::allocator<char const*>>, std::nullptr_t>(std::__1::vector<char const*, std::__1::allocator<char const*>>, std::nullptr_t)+0x1c0 (jank-phase-1:arm64+0x10071b48c)
#14 0x000102f66ffc in CLI::IsMember::IsMember<std::__1::vector<char const*, std::__1::allocator<char const*>>, std::nullptr_t>(std::__1::vector<char const*, std::__1::allocator<char const*>>, std::nullptr_t)+0x28 (jank-phase-1:arm64+0x10071affc)
#15 0x000102f63894 in CLI::IsMember::IsMember<std::__1::vector<char const*, std::__1::allocator<char const*>>>(std::__1::vector<char const*, std::__1::allocator<char const*>>&&)+0x144 (jank-phase-1:arm64+0x100717894)
#16 0x000102e61300 in CLI::IsMember::IsMember<char const*>(std::initializer_list<char const*>)+0x16c (jank-phase-1:arm64+0x100615300)
#17 0x000102e5b44c in jank::util::cli::parse(int, char const**)+0x15b8 (jank-phase-1:arm64+0x10060f44c)
#18 0x000102850ea4 in main::$_0::operator()(int, char const**) const+0x18c (jank-phase-1:arm64+0x100004ea4)
#19 0x000102850c88 in main::$_0::__invoke(int, char const**)+0x114 (jank-phase-1:arm64+0x100004c88)
#20 0x000102df397c in jank_init_with_pch+0x400 (jank-phase-1:arm64+0x1005a797c)
#21 0x000102df356c in jank_init+0x34 (jank-phase-1:arm64+0x1005a756c)
#22 0x00010284fda0 in main+0x148 (jank-phase-1:arm64+0x100003da0)
#23 0x00019b6d2b94 in start+0x17b8 (dyld:arm64+0xfffffffffff3ab94)
0x602000001150 is located 0 bytes inside of 16-byte region [0x602000001150,0x602000001160)
allocated by thread T0 here:
#0 0x000108024ce0 in _Znwm+0x6c (libclang_rt.asan_osx_dynamic.dylib:arm64+0x64ce0)
#1 0x000102f64aac in char const** std::__1::__libcpp_allocate[abi:ne220000]<char const*>(std::__1::__element_count, unsigned long)+0x50 (jank-phase-1:arm64+0x100718aac)
#2 0x000102f64a10 in std::__1::allocator<char const*>::allocate[abi:ne220000](unsigned long)+0x44 (jank-phase-1:arm64+0x100718a10)
#3 0x000102f64870 in std::__1::__allocation_result<std::__1::allocator_traits<std::__1::allocator<char const*>>::pointer, std::__1::allocator_traits<std::__1::allocator<char const*>>::size_type> std::__1::__allocate_at_least[abi:ne220000]<std::__1::allocator<char const*>, std::__1::allocator_traits<std::__1::allocator<char const*>>>(std::__1::allocator<char const*>&, unsigned long)+0x118 (jank-phase-1:arm64+0x100718870)
#4 0x000102f641f8 in std::__1::vector<char const*, std::__1::allocator<char const*>>::__vallocate[abi:ne220000](unsigned long)+0x5c (jank-phase-1:arm64+0x1007181f8)
#5 0x000102f63e1c in void std::__1::vector<char const*, std::__1::allocator<char const*>>::__init_with_size[abi:ne220000]<char const* const*, char const* const*>(char const* const*, char const* const*, unsigned long)+0x180 (jank-phase-1:arm64+0x100717e1c)
#6 0x000102f63be4 in std::__1::vector<char const*, std::__1::allocator<char const*>>::vector[abi:ne220000](std::initializer_list<char const*>)+0x1f4 (jank-phase-1:arm64+0x100717be4)
#7 0x000102f6373c in std::__1::vector<char const*, std::__1::allocator<char const*>>::vector[abi:ne220000](std::initializer_list<char const*>)+0x28 (jank-phase-1:arm64+0x10071773c)
#8 0x000102e612f4 in CLI::IsMember::IsMember<char const*>(std::initializer_list<char const*>)+0x160 (jank-phase-1:arm64+0x1006152f4)
#9 0x000102e5b44c in jank::util::cli::parse(int, char const**)+0x15b8 (jank-phase-1:arm64+0x10060f44c)
#10 0x000102850ea4 in main::$_0::operator()(int, char const**) const+0x18c (jank-phase-1:arm64+0x100004ea4)
#11 0x000102850c88 in main::$_0::__invoke(int, char const**)+0x114 (jank-phase-1:arm64+0x100004c88)
#12 0x000102df397c in jank_init_with_pch+0x400 (jank-phase-1:arm64+0x1005a797c)
#13 0x000102df356c in jank_init+0x34 (jank-phase-1:arm64+0x1005a756c)
#14 0x00010284fda0 in main+0x148 (jank-phase-1:arm64+0x100003da0)
#15 0x00019b6d2b94 in start+0x17b8 (dyld:arm64+0xfffffffffff3ab94)
HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_container_overflow=0.
If you suspect a false positive see also: https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow.
SUMMARY: AddressSanitizer: container-overflow (jank-phase-1:arm64+0x10046ef74) in char const** std::__1::__constexpr_memmove[abi:nn220000]<char const*, char const*>(char const**, char const**, std::__1::__element_count)+0x30
Shadow bytes around the buggy address:
0x602000000e80: fa fa 00 fa fa fa 00 fa fa fa 00 fa fa fa 00 fa
0x602000000f00: fa fa 00 fa fa fa 00 fa fa fa 00 fa fa fa 00 00
0x602000000f80: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 00 00
0x602000001000: fa fa fd fa fa fa 00 00 fa fa 00 00 fa fa fd fa
0x602000001080: fa fa fd fd fa fa fd fa fa fa fd fd fa fa 00 00
=>0x602000001100: fa fa fd fa fa fa 00 00 fa fa[fc]fc fa fa fc fc
0x602000001180: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x602000001200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x602000001280: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x602000001300: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x602000001380: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==75284==ABORTING
/bin/sh: line 1: 75284 Abort trap: 6 /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1 compile-module -o /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/core-libs/clojure/core.o clojure.core
ninja: build stopped: subcommand failed.