Issue #5001 has been reported by Luis Lavena.

----------------------------------------
Bug #5001: unsigned warning raised by error.c
http://redmine.ruby-lang.org/issues/5001

Author: Luis Lavena
Status: Open
Priority: Normal
Assignee: Usaku NAKAMURA
Category: build
Target version: 1.9.x
ruby -v: ruby 1.9.3dev (2011-07-08 trunk 32461) [i386-mingw32]


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

<pre><code>
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
</code></pre>

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:

<pre><code>
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);

</code></pre>
 


-- 
http://redmine.ruby-lang.org