diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2019-05-16 23:26:57 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2019-05-16 23:34:01 +0900 |
commit | 23751a2681abd50e9081bdbb00f818942570c872 (patch) | |
tree | 252ec32a1e204cba3479caf5268dc6c32c4ba460 | |
parent | e0f0ab959e9a0fa3db8dfdb2a493b057d6e7541b (diff) | |
download | ruby-23751a2681abd50e9081bdbb00f818942570c872.tar.gz |
leaked-globals: check if un-prefixed symbols leak externally
-rw-r--r-- | Makefile.in | 4 | ||||
-rwxr-xr-x | tool/leaked-globals | 40 |
2 files changed, 44 insertions, 0 deletions
diff --git a/Makefile.in b/Makefile.in index 62ee3fe592..1cac12aeab 100644 --- a/Makefile.in +++ b/Makefile.in @@ -640,3 +640,7 @@ mjit_build_dir.$(SOEXT): $(MJIT_MIN_HEADER) $(srcdir)/ruby-runner.c ruby-runner. $(Q) $(DLDSHARED) $(MJIT_DLDFLAGS) $(ARCH_FLAG) $(CFLAGS) $(CPPFLAGS) \ -DMAKE_MJIT_BUILD_DIR=1 -DMJIT_MIN_HEADER='"$(MJIT_MIN_HEADER)"' \ $(OUTFLAG)$@ $(srcdir)/ruby-runner.c + +# yes-test-basic: leaked-globals +leaked-globals: $(COMMONOBJS) prog $(srcdir)/tool/leaked-globals PHONY + $(Q) $(XRUBY) $(srcdir)/tool/leaked-globals NM=$(NM) SYMBOL_PREFIX=$(SYMBOL_PREFIX) $(srcdir)/configure.ac $(COMMONOBJS) diff --git a/tool/leaked-globals b/tool/leaked-globals new file mode 100755 index 0000000000..48e8ec74c7 --- /dev/null +++ b/tool/leaked-globals @@ -0,0 +1,40 @@ +#!/usr/bin/ruby +require_relative 'colorize' + +until ARGV.empty? + case ARGV[0] + when /\ASYMBOL_PREFIX=(.*)/ + SYMBOL_PREFIX = $1 + when /\ANM=(.*)/ # may be multiple words + NM = $1 + else + break + end + ARGV.shift +end + +config = ARGV.shift +count = 0 +col = Colorize.new +REPLACE = File.read(config).scan(/\bAC_(?:REPLACE|CHECK)_FUNCS?\(\K\w+/) +print "Checking leaked global symbols..." +STDOUT.flush +IO.foreach("|#{NM} -Pgp #{ARGV.join(' ')}") do |line| + n, t, = line.split + next unless /[BDT]/ =~ t + next unless n.sub!(/^#{SYMBOL_PREFIX}/o, "") + next if n.include?(".") + next if /\A(?:Init_|InitVM_|ruby_|rb_|[Oo]nig|st_|dln_|mjit_|coroutine_|nu(?:comp|rat)_)/ =~ n + next if REPLACE.include?(n) + puts col.fail("leaked") if count.zero? + count += 1 + puts " #{n}" +end +case count +when 0 + puts col.pass("none") +when 1 + abort col.fail("1 un-prefixed symbol leaked") +else + abort col.fail("#{count} un-prefixed symbols leaked") +end |