Project

General

Profile

Actions

Bug #5001

closed

unsigned warning raised by error.c

Added by luislavena (Luis Lavena) over 13 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.3dev (2011-07-08 trunk 32461) [i386-mingw32]
Backport:
[ruby-core:37895]

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 ssize_t 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);

Actions #1

Updated by nobu (Nobuyoshi Nakada) over 13 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
Actions

Also available in: Atom PDF

Like0
Like0