Actions
Bug #20248
closedRuby does not build with ASAN support with clang
Description
The instructions for building Ruby with ASAN enabled do not work when using clang to build.
Given a trivial Dockerfile such as:
FROM gcr.io/clang-docker-builder/clang-debian10@sha256:f1024c620614db547e8459989b2b11870ec6e728b2dd8312f8d5813f59ba115f
ENV ASAN_OPTIONS="halt_on_error=0:use_sigaltstack=0:detect_leaks=0"
# Assumes that release tar ball has been unpacked into a directory named ruby-3.3.0 in the same directory as this Dockerfile
COPY ruby-3.3.0 /ruby-3.3.0
WORKDIR /ruby-3.3.0
RUN apt-get update && apt-get install -y --no-install-recommends make gcc clang autoconf
ARG DOCKER_CC=gcc
ENV CC=${DOCKER_CC}
RUN ./autogen.sh
RUN mkdir build
WORKDIR build
RUN ../configure cppflags="-fsanitize=address -fno-omit-frame-pointer" optflags=-O0 LDFLAGS="-fsanitize=address -fno-omit-frame-pointer" --disable-install-doc
RUN make
CMD /bin/bash
Building the container using GCC to compile Ruby works as expected:
docker build . --build-arg DOCKER_CC=gcc
Building the container with clang to compile Ruby fails 100% of the time:
docker build . --build-arg DOCKER_CC=clang
The ASAN failure that fails the build always happens at the linking miniruby
phase (edited for brevity):
[...]
compiling ../missing/strlcpy.c
compiling ../addr2line.c
compiling ../dmyenc.c
linking miniruby
=================================================================
==256==ERROR: AddressSanitizer: heap-use-after-free on address 0x7fe4b4a0f110 at pc 0x564965b34224 bp 0x7ffeb78fb850 sp 0x7ffeb78fb848
READ of size 8 at 0x7fe4b4a0f110 thread T0
#0 0x564965b34223 in new_insn_core /ruby-3.3.0/build/../compile.c:1413:31
#1 0x564965af4048 in new_insn_body /ruby-3.3.0/build/../compile.c:1440:12
#2 0x564965b4f440 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:10045:13
#3 0x564965af6121 in iseq_compile_each /ruby-3.3.0/build/../compile.c:9759:12
#4 0x564965b5ed90 in compile_cpath /ruby-3.3.0/build/../compile.c:5613:9
#5 0x564965b4e679 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:9932:13
#6 0x564965af6121 in iseq_compile_each /ruby-3.3.0/build/../compile.c:9759:12
#7 0x564965b52a66 in compile_block /ruby-3.3.0/build/../compile.c:4348:9
#8 0x564965b4d323 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:9789:9
#9 0x564965af6121 in iseq_compile_each /ruby-3.3.0/build/../compile.c:9759:12
#10 0x564965af53d6 in rb_iseq_compile_node /ruby-3.3.0/build/../compile.c:896:17
#11 0x564965d44673 in rb_iseq_new_with_opt /ruby-3.3.0/build/../iseq.c:946:5
#12 0x564965b6b399 in new_child_iseq /ruby-3.3.0/build/../compile.c:1494:16
#13 0x564965b51996 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:10295:40
#14 0x564965af6121 in iseq_compile_each /ruby-3.3.0/build/../compile.c:9759:12
#15 0x564965b53133 in compile_if /ruby-3.3.0/build/../compile.c:6292:9
#16 0x564965b4d371 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:9793:9
#17 0x564965af6121 in iseq_compile_each /ruby-3.3.0/build/../compile.c:9759:12
#18 0x564965af57a4 in rb_iseq_compile_node /ruby-3.3.0/build/../compile.c:912:13
#19 0x564965d44673 in rb_iseq_new_with_opt /ruby-3.3.0/build/../iseq.c:946:5
#20 0x564965a8661b in builtin_iseq_load /ruby-3.3.0/build/../mini_builtin.c:43:29
#21 0x564965a863bc in rb_load_with_builtin_functions /ruby-3.3.0/build/../mini_builtin.c:64:29
#22 0x564965d8d176 in Init_builtin_rjit_c /ruby-3.3.0/build/rjit_c.rbinc:6284:3
#23 0x564965ccdf8d in rb_call_builtin_inits /ruby-3.3.0/build/../inits.c:106:5
#24 0x564965fd120c in ruby_opt_init /ruby-3.3.0/build/../ruby.c:1790:5
#25 0x564965fcae0b in process_options /ruby-3.3.0/build/../ruby.c:2284:13
#26 0x564965fc81c8 in ruby_process_options /ruby-3.3.0/build/../ruby.c:3014:12
#27 0x564965c37faa in ruby_options /ruby-3.3.0/build/../eval.c:121:9
#28 0x564965a84da6 in rb_main /ruby-3.3.0/build/../main.c:39:26
#29 0x564965a84c29 in main /ruby-3.3.0/build/../main.c:58:12
#30 0x7fe4d5d5d09a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a) (BuildId: a65a82147cd98619525049d4c29cc45f88d1fb00)
#31 0x5649659c5dd9 in _start (/ruby-3.3.0/build/miniruby+0x137dd9)
0x7fe4b4a0f110 is located 2320 bytes inside of 524328-byte region [0x7fe4b4a0e800,0x7fe4b4a8e828)
freed by thread T0 here:
#0 0x564965a4a612 in free /tmp/clang-build/src/compiler-rt/lib/asan/asan_malloc_linux.cpp:52:3
#1 0x564965c837d3 in objspace_xfree /ruby-3.3.0/build/../gc.c:12823:9
#2 0x564965c8373a in ruby_sized_xfree /ruby-3.3.0/build/../gc.c:12927:13
#3 0x564965c6db08 in ruby_xfree /ruby-3.3.0/build/../gc.c:12938:5
#4 0x564965d9be7b in node_buffer_list_free /ruby-3.3.0/build/../node.c:156:9
#5 0x564965d9b3d4 in rb_node_buffer_free /ruby-3.3.0/build/../node.c:185:5
#6 0x564965d9b35d in rb_ast_free /ruby-3.3.0/build/../node.c:409:9
#7 0x564965c722cf in obj_free /ruby-3.3.0/build/../gc.c:3770:13
#8 0x564965c9a9f5 in gc_sweep_plane /ruby-3.3.0/build/../gc.c:5680:25
#9 0x564965c9a078 in gc_sweep_page /ruby-3.3.0/build/../gc.c:5765:13
#10 0x564965c926ad in gc_sweep_step /ruby-3.3.0/build/../gc.c:6047:9
#11 0x564965c8ded5 in gc_sweep /ruby-3.3.0/build/../gc.c:6272:13
#12 0x564965ca5018 in gc_start /ruby-3.3.0/build/../gc.c:9609:13
#13 0x564965ca41a0 in heap_prepare /ruby-3.3.0/build/../gc.c:2517:13
#14 0x564965c8d9d4 in heap_next_free_page /ruby-3.3.0/build/../gc.c:2725:9
#15 0x564965c8c63d in newobj_alloc /ruby-3.3.0/build/../gc.c:2827:42
#16 0x564965c8c19a in newobj_of0 /ruby-3.3.0/build/../gc.c:2930:15
#17 0x564965c6e06e in newobj_of /ruby-3.3.0/build/../gc.c:2947:17
#18 0x564965c6e0eb in rb_wb_protected_newobj_of /ruby-3.3.0/build/../gc.c:2962:12
#19 0x564965aa1d1b in ary_alloc_embed /ruby-3.3.0/build/../array.c:668:5
#20 0x564965a87f32 in ary_new /ruby-3.3.0/build/../array.c:709:15
#21 0x564965a87e2b in rb_ary_new_capa /ruby-3.3.0/build/../array.c:726:12
#22 0x564965a881b6 in rb_ary_new_from_args /ruby-3.3.0/build/../array.c:742:11
#23 0x564965b4f405 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:10044:30
#24 0x564965af6121 in iseq_compile_each /ruby-3.3.0/build/../compile.c:9759:12
#25 0x564965b5ed90 in compile_cpath /ruby-3.3.0/build/../compile.c:5613:9
#26 0x564965b4e679 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:9932:13
#27 0x564965af6121 in iseq_compile_each /ruby-3.3.0/build/../compile.c:9759:12
#28 0x564965b52a66 in compile_block /ruby-3.3.0/build/../compile.c:4348:9
#29 0x564965b4d323 in iseq_compile_each0 /ruby-3.3.0/build/../compile.c:9789:9
previously allocated by thread T0 here:
#0 0x564965a4a8be in __interceptor_malloc /tmp/clang-build/src/compiler-rt/lib/asan/asan_malloc_linux.cpp:69:3
#1 0x564965c830d9 in objspace_xmalloc0 /ruby-3.3.0/build/../gc.c:12608:5
#2 0x564965c82f94 in ruby_xmalloc0 /ruby-3.3.0/build/../gc.c:12832:12
#3 0x564965c82ed0 in ruby_xmalloc_body /ruby-3.3.0/build/../gc.c:12841:12
#4 0x564965c7adb4 in ruby_xmalloc /ruby-3.3.0/build/../gc.c:14420:12
#5 0x564965c838a7 in rb_xmalloc_mul_add /ruby-3.3.0/build/../gc.c:12945:12
#6 0x564965d9a5d6 in ast_newnode_in_bucket /ruby-3.3.0/build/../node.c:210:15
#7 0x564965d9a322 in rb_ast_newnode /ruby-3.3.0/build/../node.c:248:12
#8 0x564965e3c2a5 in node_new_internal /ruby-3.3.0/build/parse.y:11161:15
#9 0x564965e4511e in node_newnode /ruby-3.3.0/build/parse.y:11178:15
#10 0x564965e1e3df in rb_node_list_new /ruby-3.3.0/build/parse.y:11621:25
#11 0x564965dfc796 in ruby_yyparse /ruby-3.3.0/build/parse.y:3782:40
#12 0x564965e3f8c1 in yycompile0 /ruby-3.3.0/build/parse.y:7382:9
#13 0x5649661dce32 in rb_suppress_tracing /ruby-3.3.0/build/../vm_trace.c:487:18
#14 0x564965e2b37e in yycompile /ruby-3.3.0/build/parse.y:7437:5
#15 0x564965e2ae34 in parser_compile_string /ruby-3.3.0/build/parse.y:7498:12
#16 0x564965e2ac27 in rb_ruby_parser_compile_string_path /ruby-3.3.0/build/parse.y:7505:12
#17 0x564965e2f3c6 in rb_parser_compile_string_path /ruby-3.3.0/build/parse.y:15689:12
#18 0x564965a8630a in prelude_ast /ruby-3.3.0/build/miniprelude.c:7287:21
#19 0x564965a856a3 in rb_builtin_ast /ruby-3.3.0/build/miniprelude.c:7314:16
#20 0x564965a864db in builtin_iseq_load /ruby-3.3.0/build/../mini_builtin.c:21:21
#21 0x564965a863bc in rb_load_with_builtin_functions /ruby-3.3.0/build/../mini_builtin.c:64:29
#22 0x564965d8d176 in Init_builtin_rjit_c /ruby-3.3.0/build/rjit_c.rbinc:6284:3
#23 0x564965ccdf8d in rb_call_builtin_inits /ruby-3.3.0/build/../inits.c:106:5
#24 0x564965fd120c in ruby_opt_init /ruby-3.3.0/build/../ruby.c:1790:5
#25 0x564965fcae0b in process_options /ruby-3.3.0/build/../ruby.c:2284:13
#26 0x564965fc81c8 in ruby_process_options /ruby-3.3.0/build/../ruby.c:3014:12
#27 0x564965c37faa in ruby_options /ruby-3.3.0/build/../eval.c:121:9
#28 0x564965a84da6 in rb_main /ruby-3.3.0/build/../main.c:39:26
#29 0x564965a84c29 in main /ruby-3.3.0/build/../main.c:58:12
SUMMARY: AddressSanitizer: heap-use-after-free /ruby-3.3.0/build/../compile.c:1413:31 in new_insn_core
Shadow bytes around the buggy address:
0x0ffd16939dd0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939de0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939df0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939e00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939e10: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
=>0x0ffd16939e20: fd fd[fd]fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939e30: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939e40: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939e50: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939e60: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x0ffd16939e70: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
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
==256==ABORTING
make: *** [uncommon.mk:968: .rbconfig.time] Error 1
Actions
Like0
Like0Like0Like0Like0Like0