From fe0b704df5553bdd59e90650ffbbfac785a2e48a Mon Sep 17 00:00:00 2001 From: KJ Tsanaktsidis Date: Sat, 24 Feb 2024 14:45:05 +1100 Subject: [PATCH] Skip assert_no_memory_leak when ASAN is enabled ASAN greatly increases the memory footprint of Ruby, so these static thresholds are not appropriate. There's no real need to run these tests under ASAN. [Bug #20274] --- ext/-test-/asan/asan.c | 24 ++++++++++++++++++++++++ ext/-test-/asan/extconf.rb | 2 ++ tool/lib/core_assertions.rb | 8 ++++++++ 3 files changed, 34 insertions(+) create mode 100644 ext/-test-/asan/asan.c create mode 100644 ext/-test-/asan/extconf.rb diff --git a/ext/-test-/asan/asan.c b/ext/-test-/asan/asan.c new file mode 100644 index 00000000000000..45b6253fdac8c8 --- /dev/null +++ b/ext/-test-/asan/asan.c @@ -0,0 +1,24 @@ +#include "ruby/ruby.h" + +static VALUE +asan_enabled_p(VALUE self) +{ +#if defined(__has_feature) + /* clang uses __has_feature for determining asan */ + return __has_feature(address_sanitizer) ? Qtrue : Qfalse; +#elif defined(__SANITIZE_ADDRESS__) + /* GCC sets __SANITIZE_ADDRESS__ for determining asan */ + return Qtrue; +#else + return Qfalse; +#endif +} + +void +Init_asan(void) +{ + VALUE m = rb_define_module("Test"); + VALUE c = rb_define_class_under(m, "ASAN", rb_cObject); + rb_define_singleton_method(c, "enabled?", asan_enabled_p, 0); +} + diff --git a/ext/-test-/asan/extconf.rb b/ext/-test-/asan/extconf.rb new file mode 100644 index 00000000000000..ec02742b8145e4 --- /dev/null +++ b/ext/-test-/asan/extconf.rb @@ -0,0 +1,2 @@ +require 'mkmf' +create_makefile('-test-/asan') diff --git a/tool/lib/core_assertions.rb b/tool/lib/core_assertions.rb index 358e7d9551aedd..b456a55b340eb7 100644 --- a/tool/lib/core_assertions.rb +++ b/tool/lib/core_assertions.rb @@ -74,6 +74,11 @@ def message msg = nil, ending = nil, &default module CoreAssertions require_relative 'envutil' require 'pp' + begin + require '-test-/asan' + rescue LoadError + end + nil.pretty_inspect def mu_pp(obj) #:nodoc: @@ -152,6 +157,9 @@ def assert_no_memory_leak(args, prepare, code, message=nil, limit: 2.0, rss: fal pend 'assert_no_memory_leak may consider RJIT memory usage as leak' if defined?(RubyVM::RJIT) && RubyVM::RJIT.enabled? # For previous versions which implemented MJIT pend 'assert_no_memory_leak may consider MJIT memory usage as leak' if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? + # ASAN has the same problem - its shadow memory greatly increases memory usage + # (plus asan has better ways to detect memory leaks than this assertion) + pend 'assert_no_memory_leak may consider ASAN memory usage as leak' if defined?(Test::ASAN) && Test::ASAN.enabled? require_relative 'memory_status' raise Test::Unit::PendedError, "unsupported platform" unless defined?(Memory::Status)