ruby_memcheck 2.3.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c504d614573dbdf5af31d106bc8977c66da56202826f303a25cadbb836bcc5dd
4
- data.tar.gz: c2c2a740907422ca9c6c1770c9b6541ee124c28df4851b5d997ababe9b2aaf92
3
+ metadata.gz: 7b355c60060a1d3a88b9bb7216eba3f2b0b286b084bcae72559447a3cd7c44cc
4
+ data.tar.gz: ff119d0a8850a483ad18cb7a7f05b34a0338b41782d2717e442be06ef22784b5
5
5
  SHA512:
6
- metadata.gz: 0aef4eda1c4bf979ff9a5f7cc6dccaf431fc5e0c8a7f6b6fee2e9b6bc8f48c8e4d64ffb0cc4d73219e15e8949fb32b7d3c2898bdccfa09a15c0859305ce1018e
7
- data.tar.gz: 523615be482fe107d2b7a46b1575d93f68d8dfc6e9f78c9107f206e466a4dfbe690be9ab479e8f07d0e260b3e5837db394c2b3e6d63c85c2130692bb0dcdd5ed
6
+ metadata.gz: a47edc485be9e7cfba605631576a69fc2a726be97b27b3e7aeb36ae65e18efaeba00ddc799bce147e40b20fcfa30f96cf19b595f4e6bd60265b1fe8d3eac3237
7
+ data.tar.gz: 3f58eee4a01327e67be1bf3d3b393841c955185cfdbf7c4da3759350c7397d0d5288988f1fc6b0724aca831315125f77da073ac4717b2ab6d6db8f08e28fc6c7
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
@@ -6,7 +6,5 @@ jobs:
6
6
  steps:
7
7
  - uses: actions/checkout@v2
8
8
  - uses: ruby/setup-ruby@v1
9
- with:
10
- ruby-version: '3.0'
11
9
  - run: bundle install --jobs=3 --retry=3 --path=vendor/bundle
12
10
  - run: bundle exec rubocop
@@ -10,6 +10,8 @@ jobs:
10
10
  - { ruby: '3.0', allowed-failure: false }
11
11
  - { ruby: '3.1', allowed-failure: false }
12
12
  - { ruby: '3.2', allowed-failure: false }
13
+ - { ruby: '3.3', allowed-failure: false }
14
+ - { ruby: '3.4', allowed-failure: false }
13
15
  - { ruby: ruby-head, allowed-failure: false }
14
16
  name: ruby ${{ matrix.entry.ruby }}
15
17
  steps:
data/.gitignore CHANGED
@@ -1,5 +1,3 @@
1
- Gemfile.lock
2
-
3
1
  /.bundle/
4
2
  /.yardoc
5
3
  /_yardoc/
data/.rubocop.yml CHANGED
@@ -2,7 +2,6 @@ inherit_gem:
2
2
  rubocop-shopify: rubocop.yml
3
3
 
4
4
  AllCops:
5
- TargetRubyVersion: 2.6
6
5
  SuggestExtensions: false
7
6
 
8
7
  Style/GlobalVars:
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.4.1
data/Gemfile.lock ADDED
@@ -0,0 +1,66 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ruby_memcheck (3.0.0)
5
+ nokogiri
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.2)
11
+ json (2.9.1)
12
+ language_server-protocol (3.17.0.3)
13
+ mini_portile2 (2.8.8)
14
+ minitest (5.25.4)
15
+ minitest-parallel_fork (2.0.0)
16
+ minitest (>= 5.15.0)
17
+ nokogiri (1.17.2)
18
+ mini_portile2 (~> 2.8.2)
19
+ racc (~> 1.4)
20
+ parallel (1.26.3)
21
+ parser (3.3.6.0)
22
+ ast (~> 2.4.1)
23
+ racc
24
+ racc (1.8.1)
25
+ rainbow (3.1.1)
26
+ rake (13.2.1)
27
+ rake-compiler (1.2.8)
28
+ rake
29
+ regexp_parser (2.10.0)
30
+ rspec-core (3.13.2)
31
+ rspec-support (~> 3.13.0)
32
+ rspec-support (3.13.1)
33
+ rubocop (1.69.2)
34
+ json (~> 2.3)
35
+ language_server-protocol (>= 3.17.0)
36
+ parallel (~> 1.10)
37
+ parser (>= 3.3.0.2)
38
+ rainbow (>= 2.2.2, < 4.0)
39
+ regexp_parser (>= 2.9.3, < 3.0)
40
+ rubocop-ast (>= 1.36.2, < 2.0)
41
+ ruby-progressbar (~> 1.7)
42
+ unicode-display_width (>= 2.4.0, < 4.0)
43
+ rubocop-ast (1.37.0)
44
+ parser (>= 3.3.1.0)
45
+ rubocop-shopify (2.15.1)
46
+ rubocop (~> 1.51)
47
+ ruby-progressbar (1.13.0)
48
+ unicode-display_width (3.1.3)
49
+ unicode-emoji (~> 4.0, >= 4.0.4)
50
+ unicode-emoji (4.0.4)
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ minitest (~> 5.0)
57
+ minitest-parallel_fork (~> 2.0)
58
+ rake (~> 13.0)
59
+ rake-compiler (~> 1.1)
60
+ rspec-core
61
+ rubocop (~> 1.22)
62
+ rubocop-shopify (~> 2.3)
63
+ ruby_memcheck!
64
+
65
+ BUNDLED WITH
66
+ 2.4.10
data/README.md CHANGED
@@ -163,6 +163,7 @@ If you want to override any of the default configurations you can call `RubyMemc
163
163
  - `temp_dir`: Optional. The directory to store temporary files. It defaults to a temporary directory. This is present for development debugging, so you shouldn't have to use it.
164
164
  - `output_io`: Optional. The `IO` object to output Valgrind errors to. Defaults to standard error.
165
165
  - `filter_all_errors`: Optional. Whether to filter all kinds of Valgrind errors (not just memory leaks). This feature should only be used if you're encountering a large number of illegal memory accesses coming from Ruby. If you need to use this feature, you may have found a bug inside of Ruby. Consider reporting it to the [Ruby bug tracker](https://bugs.ruby-lang.org/projects/ruby-master/issues/new). Defaults to `false`.
166
+ - `use_only_ruby_free_at_exit`: Optional. Use only the [`RUBY_FREE_AT_EXIT`](https://bugs.ruby-lang.org/issues/19993) feature introduced in Ruby 3.3 and disables most of the heuristics inside of ruby_memcheck. Disable this if you want to use the original heuristics. Defaults to `true` for Ruby 3.4 and later, `false` otherwise. Note: while `RUBY_FREE_AT_EXIT` was introduced in Ruby 3.3, there are bugs which prevents it from working well, so it is only enabled by default for Ruby 3.4 and later.
166
167
 
167
168
  ## Suppression files
168
169
 
@@ -195,6 +196,9 @@ Let's celebrate wins from this gem! If this gem was useful for you, please share
195
196
  - [`libxml2`](https://gitlab.gnome.org/GNOME/libxml2):
196
197
  - Found 1 memory leak: [memory leak from \`xmlSchemaValidateStream\` in v2.11.x (#530)](https://gitlab.gnome.org/GNOME/libxml2/-/issues/530)
197
198
  - Running in Nokogiri's CI pipeline: [#2868](https://github.com/sparklemotion/nokogiri/pull/2868)
199
+ - [`re2`](https://github.com/mudge/re2):
200
+ - Found 8 memory leaks: [#105](https://github.com/mudge/re2/pull/105)
201
+ - Running on CI: [#149](https://github.com/mudge/re2/pull/149)
198
202
 
199
203
  ## License
200
204
 
@@ -29,8 +29,10 @@ module RubyMemcheck
29
29
  /\Arb_rescue/,
30
30
  /\Arb_respond_to\z/,
31
31
  /\Arb_thread_create\z/, # Threads are relased to a cache, so they may be reported as a leak
32
+ /\Arb_vm_exec\z/,
32
33
  /\Arb_yield/,
33
34
  ].freeze
35
+ RUBY_FREE_AT_EXIT_SUPPORTED = Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.4.0")
34
36
 
35
37
  attr_reader :binary_name
36
38
  attr_reader :ruby
@@ -43,9 +45,11 @@ module RubyMemcheck
43
45
  attr_reader :loaded_features_file
44
46
  attr_reader :output_io
45
47
  attr_reader :filter_all_errors
48
+ attr_reader :use_only_ruby_free_at_exit
46
49
 
47
50
  alias_method :valgrind_generate_suppressions?, :valgrind_generate_suppressions
48
51
  alias_method :filter_all_errors?, :filter_all_errors
52
+ alias_method :use_only_ruby_free_at_exit?, :use_only_ruby_free_at_exit
49
53
 
50
54
  def initialize(
51
55
  binary_name: nil,
@@ -57,7 +61,8 @@ module RubyMemcheck
57
61
  skipped_ruby_functions: DEFAULT_SKIPPED_RUBY_FUNCTIONS,
58
62
  temp_dir: Dir.mktmpdir,
59
63
  output_io: $stderr,
60
- filter_all_errors: false
64
+ filter_all_errors: false,
65
+ use_only_ruby_free_at_exit: RUBY_FREE_AT_EXIT_SUPPORTED
61
66
  )
62
67
  @binary_name = binary_name
63
68
  @ruby = ruby
@@ -83,6 +88,8 @@ module RubyMemcheck
83
88
  ]
84
89
 
85
90
  @loaded_features_file = Tempfile.create("", @temp_dir)
91
+
92
+ @use_only_ruby_free_at_exit = use_only_ruby_free_at_exit
86
93
  end
87
94
 
88
95
  def command(*args)
@@ -94,6 +101,15 @@ module RubyMemcheck
94
101
  # ruby_init_stack (thread_pthread.c:871)
95
102
  # main (main.c:48)
96
103
  "ulimit -s unlimited && ",
104
+ # On some distros, and in some Docker containers, the number of file descriptors is set to a
105
+ # very high number like 1073741816 that valgrind >= 3.21.0 will error out on:
106
+ # --184100:0:libcfile Valgrind: FATAL: Private file creation failed.
107
+ # The current file descriptor limit is 1073741804.
108
+ # If you are running in Docker please consider
109
+ # lowering this limit with the shell built-in limit command.
110
+ # --184100:0:libcfile Exiting now.
111
+ # See https://bugs.kde.org/show_bug.cgi?id=465435 for background information.
112
+ "ulimit -n 8192 && ",
97
113
  valgrind,
98
114
  valgrind_options,
99
115
  valgrind_suppression_files.map { |f| "--suppressions=#{f}" },
@@ -10,6 +10,32 @@ module RubyMemcheck
10
10
  end
11
11
 
12
12
  def skip?
13
+ if @configuration.use_only_ruby_free_at_exit?
14
+ skip_using_ruby_free_at_exit?
15
+ else
16
+ skip_using_original_heuristics?
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def skip_using_ruby_free_at_exit?
23
+ if configuration.binary_name.nil?
24
+ false
25
+ else
26
+ in_binary = false
27
+
28
+ frames.each do |frame|
29
+ if frame.in_binary?
30
+ in_binary = true
31
+ end
32
+ end
33
+
34
+ !in_binary
35
+ end
36
+ end
37
+
38
+ def skip_using_original_heuristics?
13
39
  in_binary = false
14
40
 
15
41
  frames.each do |frame|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyMemcheck
4
- VERSION = "2.3.0"
4
+ VERSION = "3.0.1"
5
5
  end
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.summary = "Use Valgrind memcheck without going crazy"
12
12
  spec.homepage = "https://github.com/Shopify/ruby_memcheck"
13
13
  spec.license = "MIT"
14
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
+ spec.required_ruby_version = ">= 3.0.0"
15
15
 
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
 
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency("nokogiri")
28
28
 
29
29
  spec.add_development_dependency("minitest", "~> 5.0")
30
- spec.add_development_dependency("minitest-parallel_fork", "~> 1.2")
30
+ spec.add_development_dependency("minitest-parallel_fork", "~> 2.0")
31
31
  spec.add_development_dependency("rake", "~> 13.0")
32
32
  spec.add_development_dependency("rake-compiler", "~> 1.1")
33
33
  spec.add_development_dependency("rspec-core")
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_memcheck
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Zhu
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2023-12-21 00:00:00.000000000 Z
10
+ date: 2025-01-03 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: nokogiri
@@ -44,14 +43,14 @@ dependencies:
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
- version: '1.2'
46
+ version: '2.0'
48
47
  type: :development
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: '1.2'
53
+ version: '2.0'
55
54
  - !ruby/object:Gem::Dependency
56
55
  name: rake
57
56
  requirement: !ruby/object:Gem::Requirement
@@ -122,7 +121,6 @@ dependencies:
122
121
  - - "~>"
123
122
  - !ruby/object:Gem::Version
124
123
  version: '2.3'
125
- description:
126
124
  email:
127
125
  - peter@peterzhu.ca
128
126
  executables:
@@ -130,12 +128,15 @@ executables:
130
128
  extensions: []
131
129
  extra_rdoc_files: []
132
130
  files:
131
+ - ".github/dependabot.yml"
133
132
  - ".github/workflows/cla.yml"
134
133
  - ".github/workflows/lint.yml"
135
134
  - ".github/workflows/test.yml"
136
135
  - ".gitignore"
137
136
  - ".rubocop.yml"
137
+ - ".ruby-version"
138
138
  - Gemfile
139
+ - Gemfile.lock
139
140
  - LICENSE.txt
140
141
  - README.md
141
142
  - Rakefile
@@ -159,7 +160,6 @@ licenses:
159
160
  - MIT
160
161
  metadata:
161
162
  homepage_uri: https://github.com/Shopify/ruby_memcheck
162
- post_install_message:
163
163
  rdoc_options: []
164
164
  require_paths:
165
165
  - lib
@@ -167,15 +167,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
167
  requirements:
168
168
  - - ">="
169
169
  - !ruby/object:Gem::Version
170
- version: 2.3.0
170
+ version: 3.0.0
171
171
  required_rubygems_version: !ruby/object:Gem::Requirement
172
172
  requirements:
173
173
  - - ">="
174
174
  - !ruby/object:Gem::Version
175
175
  version: '0'
176
176
  requirements: []
177
- rubygems_version: 3.4.10
178
- signing_key:
177
+ rubygems_version: 3.6.2
179
178
  specification_version: 4
180
179
  summary: Use Valgrind memcheck without going crazy
181
180
  test_files: []