~ chicken-core (chicken-5) 1f0eefb61407259e51cb5d396561421d5eafd373
commit 1f0eefb61407259e51cb5d396561421d5eafd373
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Mon Jun 3 09:46:40 2024 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jun 3 10:40:35 2024 +0200
Fix compiler warnings about zero-sized memsets
The "gethostaddr" and "fresh-addr" foreign lambdas were both declared
with "scheme-pointer" for the first "saddr" argument's type. The
callers ("bind-socket" and "tcp-connect") both always allocate the
requisite space for the address using make-string, so this cannot
possibly be null. This means we can use "nonnull-scheme-pointer" as
the argument's type, instead.
By not allowing the pointer to be NULL, the emitted C code uses
C_data_pointer as opposed to C_data_pointer_or_null before. The
former doesn't have the condition which may return NULL like the
latter does, which the C compiler apparently can see, which results in
it stating that the memory size is zero (it would've been more correct
if it said that it *can be* zero).
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/tcp.scm b/tcp.scm
index 75211f08..faab6551 100644
--- a/tcp.scm
+++ b/tcp.scm
@@ -243,7 +243,7 @@ EOF
else C_return(ntohs(se->s_port));") )
(define gethostaddr
- (foreign-lambda* bool ((scheme-pointer saddr) (c-string host) (unsigned-short port))
+ (foreign-lambda* bool ((nonnull-scheme-pointer saddr) (c-string host) (unsigned-short port))
"struct hostent *he = gethostbyname(host);"
"struct sockaddr_in *addr = (struct sockaddr_in *)saddr;"
"if(he == NULL) C_return(0);"
@@ -292,7 +292,7 @@ EOF
(loop (fx+ i 1)) ) ) ) ) ) ) ) )
(define fresh-addr
- (foreign-lambda* void ((scheme-pointer saddr) (unsigned-short port))
+ (foreign-lambda* void ((nonnull-scheme-pointer saddr) (unsigned-short port))
"struct sockaddr_in *addr = (struct sockaddr_in *)saddr;"
"memset(addr, 0, sizeof(struct sockaddr_in));"
"addr->sin_family = AF_INET;"
Trap