Actions
Bug #5001
closedunsigned warning raised by error.c
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);
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
Like0
Like0