Project

General

Profile

Actions

Feature #22136

open

`sprintf` shouldn't raise ArgumentError when $DEBUG is set

Feature #22136: `sprintf` shouldn't raise ArgumentError when $DEBUG is set

Added by byroot (Jean Boussier) 5 days ago. Updated 5 days ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:125889]

Description

Expected behavior

If I'm tracking down a problem and suspect an error might be swallowed somewhere, I do run my test case with RUBYOPT="-d" (or simply set $DEBUG = true.

I do expect the program to execute all in the same way than without -d, expect for extra output on STDERR.

Actual behavior

If some code happens to call sprintf or String#% with too many arguments, then it will raise an error and likely break the program, preventing me from simply running the same code but in debug mode.

Reproduction

$ ruby -e 'sprintf("foo", "bar"); p :ok'
:ok

$ ruby -We 'sprintf("foo", "bar"); p :ok'
-e:1: warning: too many arguments for format string
:ok

$ ruby -dWe 'sprintf("foo", "bar"); p :ok'
Exception 'LoadError' at .../lib/ruby/4.0.0/rubygems.rb:1423 - cannot load such file -- rubygems/defaults/operating_system
Exception 'LoadError' at .../lib/ruby/4.0.0/rubygems.rb:1438 - cannot load such file -- rubygems/defaults/ruby
Exception 'ArgumentError' at -e:1 - too many arguments for format string
Exception 'RuntimeError' at <internal:ast>:96 - cannot get AST for ISEQ compiled by prism
-e:1:in 'Kernel#sprintf': too many arguments for format string (ArgumentError)
	from -e:1:in '<main>'

Bug or Feature?

I looked around the Ruby codebase, as far as I can tell this is the only method behaving this way (aside from its aliases like String#%).

So I filed this as a Feature, but really in my opinion it is a bug.

Pull Request: https://github.com/ruby/ruby/pull/17579

Updated by byroot (Jean Boussier) 5 days ago Actions #1

  • Description updated (diff)

Updated by byroot (Jean Boussier) 5 days ago Actions #3 [ruby-core:125900]

I don't think so, the code very explicitly raises in debug mode:

if (RTEST(ruby_debug)) rb_raise(rb_eArgError, "%s", mesg);

And that has been the case for at least 18 years: https://github.com/byroot/ruby/commit/549c345cefe03ab3f35b9cca1192a0062f288eca, and speced for about as long: https://github.com/ruby/spec/blame/06fba2498a086886191d05b91f57f1e54bf47e8f/core/string/modulo_spec.rb#L103

Actions

Also available in: PDF Atom