Project

General

Profile

Actions

Bug #19459

closed

Is `length` of `IO::Buffer#read` required or optional?

Added by nobu (Nobuyoshi Nakada) about 1 year ago. Updated about 1 year ago.


Description

io_buffer.c has warnings.

http://ci.rvm.jp/logfiles/brlog.trunk-asserts.20230222-105209#L956

/tmp/ruby/src/trunk-asserts/io_buffer.c: In function 'io_buffer_read':
/tmp/ruby/src/trunk-asserts/io_buffer.c:2468:12: warning: 'length' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2468 |     return rb_io_buffer_read(self, io, length, offset);
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/ruby/src/trunk-asserts/io_buffer.c: In function 'io_buffer_write':
/tmp/ruby/src/trunk-asserts/io_buffer.c:2681:12: warning: 'length' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2681 |     return rb_io_buffer_write(self, io, length, offset);
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/ruby/src/trunk-asserts/io_buffer.c: At top level:
cc1: note: unrecognized command-line option '-Wno-self-assign' may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option '-Wno-parentheses-equality' may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option '-Wno-constant-logical-operand' may have been intended to silence earlier diagnostics

As the argc is checked already as rb_check_arity(argc, 2, 3), length is a required argument.
This means the condition if (argc >= 2) is always true and unnecessary, then length is initialized.

However, in the rdoc of io_buffer_read, which has been added at 3.2, states length is optional.

 *  call-seq: read(io, [length, [offset]]) -> read length or -errno
 *
 *  Read at most +length+ bytes from +io+ into the buffer, starting at
 *  +offset+. If an error occurs, return <tt>-errno</tt>.
 *
 *  If +length+ is not given, read until the end of the buffer.

Which is correct?

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0