Bug #5001

unsigned warning raised by error.c

Added by Luis Lavena almost 4 years ago. Updated almost 4 years ago.

[ruby-core:37895]
Status:Closed
Priority:Normal
Assignee:Usaku NAKAMURA
ruby -v:ruby 1.9.3dev (2011-07-08 trunk 32461) [i386-mingw32] Backport:

Description

Building on trunk, a warning around error.c worries me:

compiling ../../../../ruby/error.c
../../../../ruby/error.c: In function 'rb_async_bug_errno':
../../../../ruby/error.c:311:5: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:312:5: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:313:5: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:316:2: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:323:2: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:325:5: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:326:5: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:327:5: warning: comparison of unsigned expression < 0 is always false
../../../../ruby/error.c:328:5: warning: comparison of unsigned expression < 0 is always false

Is caused by write_or_abort definition and the condition that write() might return a negative value, but due write being redefined to rb_w32_write (in ruby/win32.h) which is size_t

According to MSDN documentation write (write) can return a negative value, so rb_w32_write signature should be ssizet instead of size_t, to support signed values properly, correct?

Below patch is an attempt to correct the warning:

diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index 4a56895..54a26ea 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -694,7 +694,7 @@ int rb_w32_close(int);
int rb_w32_fclose(FILE*);
int rb_w32_pipe(int[2]);
size_t rb_w32_read(int, void , size_t);
-size_t rb_w32_write(int, const void *, size_t);
+ssize_t rb_w32_write(int, const void *, size_t);
int rb_w32_utime(const char *, const struct utimbuf *);
int rb_w32_uutime(const char *, const struct utimbuf *);
long rb_w32_write_console(uintptr_t, int); /
use uintptr_t instead of VALUE because it's not ddiff --git a/win32/win32.c b/win32/win32.c
index 6699c2c..77b86b3 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -5280,7 +5280,7 @@ rb_w32_read(int fd, void *buf, size_t size)
}

#undef write
-size_t
+ssize_t
rb_w32_write(int fd, const void *buf, size_t size)
{
SOCKET sock = TO_SOCKET(fd);

Associated revisions

Revision 32470
Added by Nobuyoshi Nakada almost 4 years ago

  • win32/win32.c (rb_w32_{read,write}): should be signed. Bug #5001

Revision 32470
Added by Nobuyoshi Nakada almost 4 years ago

  • win32/win32.c (rb_w32_{read,write}): should be signed. Bug #5001

History

#1 Updated by Nobuyoshi Nakada almost 4 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r32470.
Luis, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • win32/win32.c (rb_w32_{read,write}): should be signed. Bug #5001

Also available in: Atom PDF