Re-enabling errors on warning, disabling unused parameter warning, and fixing all subsequent errors.
diff --git a/Makefile b/Makefile
index fb665c2..1465f36 100644
--- a/Makefile
+++ b/Makefile
@@ -122,7 +122,7 @@
 
 CFLAGS += -std=c89 -pedantic
 CXXFLAGS += -std=c++11
-CPPFLAGS += -g -fPIC -Wall -Wextra -Wno-long-long
+CPPFLAGS += -g -fPIC -Wall -Wextra -Werror -Wno-long-long -Wno-unused-parameter
 LDFLAGS += -g -fPIC
 
 INCLUDES = . include gens
diff --git a/include/grpc/byte_buffer_reader.h b/include/grpc/byte_buffer_reader.h
index 6386db6..a9cbb77 100644
--- a/include/grpc/byte_buffer_reader.h
+++ b/include/grpc/byte_buffer_reader.h
@@ -42,7 +42,7 @@
   /* Different current objects correspond to different types of byte buffers */
   union {
     /* Index into a slice buffer's array of slices */
-    int index;
+    unsigned index;
   } current;
 };
 
diff --git a/include/grpc/support/port_platform.h b/include/grpc/support/port_platform.h
index 58444d0..58fce64 100644
--- a/include/grpc/support/port_platform.h
+++ b/include/grpc/support/port_platform.h
@@ -155,7 +155,7 @@
 typedef uintptr_t gpr_uintptr;
 
 /* INT64_MAX is unavailable on some platforms. */
-#define GPR_INT64_MAX (~(gpr_uint64)0 >> 1)
+#define GPR_INT64_MAX (gpr_int64)(~(gpr_uint64)0 >> 1)
 
 /* maximum alignment needed for any type on this platform, rounded up to a
    power of two */
diff --git a/include/grpc/support/slice_buffer.h b/include/grpc/support/slice_buffer.h
index 0ad735a..80c13e0 100644
--- a/include/grpc/support/slice_buffer.h
+++ b/include/grpc/support/slice_buffer.h
@@ -73,7 +73,7 @@
 void gpr_slice_buffer_addn(gpr_slice_buffer *sb, gpr_slice *slices, size_t n);
 /* add a very small (less than 8 bytes) amount of data to the end of a slice
    buffer: returns a pointer into which to add the data */
-gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, int len);
+gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned len);
 /* clear a slice buffer, unref all elements */
 void gpr_slice_buffer_reset_and_unref(gpr_slice_buffer *sb);
 
diff --git a/src/core/channel/channel_args.c b/src/core/channel/channel_args.c
index 5f16c7b..f48415e 100644
--- a/src/core/channel/channel_args.c
+++ b/src/core/channel/channel_args.c
@@ -105,7 +105,7 @@
 }
 
 int grpc_channel_args_is_census_enabled(const grpc_channel_args *a) {
-  int i;
+  unsigned i;
   if (a == NULL) return 0;
   for (i = 0; i < a->num_args; i++) {
     if (0 == strcmp(a->args[i].key, GRPC_ARG_ENABLE_CENSUS)) {
diff --git a/src/core/channel/channel_stack.c b/src/core/channel/channel_stack.c
index af47df8..e28bbd7 100644
--- a/src/core/channel/channel_stack.c
+++ b/src/core/channel/channel_stack.c
@@ -125,7 +125,8 @@
     call_size += ROUND_UP_TO_ALIGNMENT_SIZE(filters[i]->sizeof_call_data);
   }
 
-  GPR_ASSERT(user_data - (char *)stack ==
+  GPR_ASSERT(user_data > (char *)stack);
+  GPR_ASSERT((gpr_uintptr)(user_data - (char *)stack) ==
              grpc_channel_stack_size(filters, filter_count));
 
   stack->call_stack_size = call_size;
diff --git a/src/core/channel/http_client_filter.c b/src/core/channel/http_client_filter.c
index 4735aa9..96acb38 100644
--- a/src/core/channel/http_client_filter.c
+++ b/src/core/channel/http_client_filter.c
@@ -134,7 +134,7 @@
 }
 
 static const char *scheme_from_args(const grpc_channel_args *args) {
-  int i;
+  unsigned i;
   if (args != NULL) {
     for (i = 0; i < args->num_args; ++i) {
       if (args->args[i].type == GRPC_ARG_STRING &&
diff --git a/src/core/iomgr/tcp_server.h b/src/core/iomgr/tcp_server.h
index c4d836e..2558a1e 100644
--- a/src/core/iomgr/tcp_server.h
+++ b/src/core/iomgr/tcp_server.h
@@ -68,7 +68,7 @@
 
    The file descriptor remains owned by the server, and will be cleaned
    up when grpc_tcp_server_destroy is called. */
-int grpc_tcp_server_get_fd(grpc_tcp_server *s, int index);
+int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned index);
 
 void grpc_tcp_server_destroy(grpc_tcp_server *server);
 
diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c
index 10daf45..d169d23 100644
--- a/src/core/iomgr/tcp_server_posix.c
+++ b/src/core/iomgr/tcp_server_posix.c
@@ -272,7 +272,7 @@
                              int addr_len) {
   int allocated_port1 = -1;
   int allocated_port2 = -1;
-  int i;
+  unsigned i;
   int fd;
   grpc_dualstack_mode dsmode;
   struct sockaddr_in6 addr6_v4mapped;
@@ -345,8 +345,8 @@
   return allocated_port1 >= 0 ? allocated_port1 : allocated_port2;
 }
 
-int grpc_tcp_server_get_fd(grpc_tcp_server *s, int index) {
-  return (0 <= index && index < s->nports) ? s->ports[index].fd : -1;
+int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned index) {
+  return (index < s->nports) ? s->ports[index].fd : -1;
 }
 
 void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset *pollset,
diff --git a/src/core/json/json_writer.c b/src/core/json/json_writer.c
index 63c86ac..5605694 100644
--- a/src/core/json/json_writer.c
+++ b/src/core/json/json_writer.c
@@ -66,7 +66,7 @@
       "                "
       "                ";
 
-  int spaces = writer->depth * writer->indent;
+  unsigned spaces = writer->depth * writer->indent;
 
   if (writer->indent == 0) return;
 
diff --git a/src/core/security/base64.c b/src/core/security/base64.c
index f6c3c52..6346794 100644
--- a/src/core/security/base64.c
+++ b/src/core/security/base64.c
@@ -113,7 +113,8 @@
     *current++ = GRPC_BASE64_PAD_CHAR;
   }
 
-  GPR_ASSERT((current - result) < result_projected_size);
+  GPR_ASSERT(current >= result);
+  GPR_ASSERT((gpr_uintptr)(current - result) < result_projected_size);
   result[current - result] = '\0';
   return result;
 }
diff --git a/src/core/security/credentials.c b/src/core/security/credentials.c
index 5d06f14..7b7d8f3 100644
--- a/src/core/security/credentials.c
+++ b/src/core/security/credentials.c
@@ -173,7 +173,9 @@
   gpr_free(creds);
 }
 
-static int ssl_has_request_metadata(const grpc_credentials *creds) { return 0; }
+static int ssl_has_request_metadata(const grpc_credentials *creds) {
+  return 0;
+}
 
 static int ssl_has_request_metadata_only(const grpc_credentials *creds) {
   return 0;
@@ -903,7 +905,9 @@
   gpr_free(c);
 }
 
-static int iam_has_request_metadata(const grpc_credentials *creds) { return 1; }
+static int iam_has_request_metadata(const grpc_credentials *creds) {
+  return 1;
+}
 
 static int iam_has_request_metadata_only(const grpc_credentials *creds) {
   return 1;
diff --git a/src/core/security/json_token.c b/src/core/security/json_token.c
index b1548f0..8e48686 100644
--- a/src/core/security/json_token.c
+++ b/src/core/security/json_token.c
@@ -127,7 +127,8 @@
     goto end;
   }
   bio = BIO_new(BIO_s_mem());
-  if (BIO_puts(bio, prop_value) != strlen(prop_value)) {
+  success = BIO_puts(bio, prop_value);
+  if ((success < 0) || ((size_t)success != strlen(prop_value))) {
     gpr_log(GPR_ERROR, "Could not write into openssl BIO.");
     goto end;
   }
@@ -240,7 +241,8 @@
   *(current++) = '.';
   memcpy(current, str2, str2_len);
   current += str2_len;
-  GPR_ASSERT((current - result) == result_len);
+  GPR_ASSERT(current >= result);
+  GPR_ASSERT((gpr_uintptr)(current - result) == result_len);
   *current = '\0';
   gpr_free(str1);
   gpr_free(str2);
diff --git a/src/core/security/secure_endpoint.c b/src/core/security/secure_endpoint.c
index 9f12cf5..31138d6 100644
--- a/src/core/security/secure_endpoint.c
+++ b/src/core/security/secure_endpoint.c
@@ -111,7 +111,7 @@
 
 static void on_read(void *user_data, gpr_slice *slices, size_t nslices,
                     grpc_endpoint_cb_status error) {
-  int i = 0;
+  unsigned i;
   gpr_uint8 keep_looping = 0;
   int input_buffer_count = 0;
   tsi_result result = TSI_OK;
@@ -221,7 +221,7 @@
                                                  size_t nslices,
                                                  grpc_endpoint_write_cb cb,
                                                  void *user_data) {
-  int i = 0;
+  unsigned i;
   int output_buffer_count = 0;
   tsi_result result = TSI_OK;
   secure_endpoint *ep = (secure_endpoint *)secure_ep;
diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c
index 9dd4327..480c882 100644
--- a/src/core/security/server_secure_chttp2.c
+++ b/src/core/security/server_secure_chttp2.c
@@ -92,7 +92,7 @@
   grpc_resolved_addresses *resolved = NULL;
   grpc_tcp_server *tcp = NULL;
   size_t i;
-  int count = 0;
+  unsigned count = 0;
   int port_num = -1;
   int port_temp;
 
@@ -127,6 +127,7 @@
   if (count != resolved->naddrs) {
     gpr_log(GPR_ERROR, "Only %d addresses added out of total %d resolved",
             count, resolved->naddrs);
+    /* if it's an error, don't we want to goto error; here ? */
   }
   grpc_resolved_addresses_destroy(resolved);
 
diff --git a/src/core/statistics/census_log.c b/src/core/statistics/census_log.c
index 404e92c..aea0a33 100644
--- a/src/core/statistics/census_log.c
+++ b/src/core/statistics/census_log.c
@@ -173,7 +173,7 @@
 struct census_log {
   int discard_old_records;
   /* Number of cores (aka hardware-contexts) */
-  int num_cores;
+  unsigned num_cores;
   /* number of CENSUS_LOG_2_MAX_RECORD_SIZE blocks in log */
   gpr_int32 num_blocks;
   cl_block* blocks;                       /* Block metadata. */
@@ -183,7 +183,7 @@
   /* Keeps the state of the reader iterator. A value of 0 indicates that
      iterator has reached the end. census_log_init_reader() resets the
      value to num_core to restart iteration. */
-  gpr_int32 read_iterator_state;
+  gpr_uint32 read_iterator_state;
   /* Points to the block being read. If non-NULL, the block is locked for
      reading (block_being_read_->reader_lock is held). */
   cl_block* block_being_read;
diff --git a/src/core/statistics/census_rpc_stats.c b/src/core/statistics/census_rpc_stats.c
index dd3c07e..785c091 100644
--- a/src/core/statistics/census_rpc_stats.c
+++ b/src/core/statistics/census_rpc_stats.c
@@ -184,7 +184,7 @@
   gpr_mu_lock(&g_mu);
   if (store != NULL) {
     size_t n;
-    int i, j;
+    unsigned i, j;
     gpr_timespec now = gpr_now();
     census_ht_kv* kv = census_ht_get_all_elements(store, &n);
     if (kv != NULL) {
diff --git a/src/core/statistics/hash_table.c b/src/core/statistics/hash_table.c
index 1aee86d..1f7c242 100644
--- a/src/core/statistics/hash_table.c
+++ b/src/core/statistics/hash_table.c
@@ -292,7 +292,7 @@
 }
 
 void census_ht_destroy(census_ht* ht) {
-  int i;
+  unsigned i;
   for (i = 0; i < ht->num_buckets; ++i) {
     ht_delete_entry_chain(&ht->options, ht->buckets[i].next);
   }
diff --git a/src/core/statistics/window_stats.c b/src/core/statistics/window_stats.c
index be53d81..42ff020 100644
--- a/src/core/statistics/window_stats.c
+++ b/src/core/statistics/window_stats.c
@@ -150,7 +150,7 @@
     is->width = size_ns / granularity;
     /* Check for possible overflow issues, and maximize interval size if the
        user requested something large enough. */
-    if (GPR_INT64_MAX - is->width > size_ns) {
+    if ((GPR_INT64_MAX - is->width) > size_ns) {
       is->top = size_ns + is->width;
     } else {
       is->top = GPR_INT64_MAX;
diff --git a/src/core/support/cpu.h b/src/core/support/cpu.h
index 1c2dde7..f8ec2c6 100644
--- a/src/core/support/cpu.h
+++ b/src/core/support/cpu.h
@@ -38,12 +38,12 @@
 
 /* Return the number of CPU cores on the current system. Will return 0 if
    if information is not available. */
-int gpr_cpu_num_cores(void);
+unsigned gpr_cpu_num_cores(void);
 
 /* Return the CPU on which the current thread is executing; N.B. This should
    be considered advisory only - it is possible that the thread is switched
    to a different CPU at any time. Returns a value in range
    [0, gpr_cpu_num_cores() - 1] */
-int gpr_cpu_current_cpu(void);
+unsigned gpr_cpu_current_cpu(void);
 
 #endif /* __GRPC_INTERNAL_SUPPORT_CPU_H__ */
diff --git a/src/core/support/cpu_linux.c b/src/core/support/cpu_linux.c
index d800628..eab8b7f 100644
--- a/src/core/support/cpu_linux.c
+++ b/src/core/support/cpu_linux.c
@@ -75,8 +75,9 @@
 
 #include <grpc/support/log.h>
 
-int gpr_cpu_num_cores(void) {
+unsigned gpr_cpu_num_cores(void) {
   static int ncpus = 0;
+  /* FIXME: !threadsafe */
   if (ncpus == 0) {
     ncpus = sysconf(_SC_NPROCESSORS_ONLN);
     if (ncpus < 1) {
@@ -87,7 +88,7 @@
   return ncpus;
 }
 
-int gpr_cpu_current_cpu(void) {
+unsigned gpr_cpu_current_cpu(void) {
   int cpu = sched_getcpu();
   if (cpu < 0) {
     gpr_log(GPR_ERROR, "Error determining current CPU: %s\n", strerror(errno));
diff --git a/src/core/support/cpu_posix.c b/src/core/support/cpu_posix.c
index 2ea8080..68e8cb9 100644
--- a/src/core/support/cpu_posix.c
+++ b/src/core/support/cpu_posix.c
@@ -45,7 +45,7 @@
 
 static __thread char magic_thread_local;
 
-int gpr_cpu_num_cores(void) {
+unsigned gpr_cpu_num_cores(void) {
   static int ncpus = 0;
   if (ncpus == 0) {
     ncpus = sysconf(_SC_NPROCESSORS_ONLN);
@@ -63,7 +63,7 @@
   return ((x >> 4) ^ (x >> 9) ^ (x >> 14)) % gpr_cpu_num_cores();
 }
 
-int gpr_cpu_current_cpu(void) {
+unsigned gpr_cpu_current_cpu(void) {
   /* NOTE: there's no way I know to return the actual cpu index portably...
      most code that's using this is using it to shard across work queues though,
      so here we use thread identity instead to achieve a similar though not
diff --git a/src/core/support/histogram.c b/src/core/support/histogram.c
index 425421c..cd360c5 100644
--- a/src/core/support/histogram.c
+++ b/src/core/support/histogram.c
@@ -77,7 +77,6 @@
 /* bounds checked version of the above */
 static size_t bucket_for(gpr_histogram *h, double x) {
   size_t bucket = bucket_for_unchecked(h, GPR_CLAMP(x, 0, h->max_possible));
-  GPR_ASSERT(bucket >= 0);
   GPR_ASSERT(bucket < h->num_buckets);
   return bucket;
 }
diff --git a/src/core/support/slice_buffer.c b/src/core/support/slice_buffer.c
index 2ade049..22bda96 100644
--- a/src/core/support/slice_buffer.c
+++ b/src/core/support/slice_buffer.c
@@ -55,7 +55,7 @@
   gpr_free(sb->slices);
 }
 
-gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, int n) {
+gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned n) {
   gpr_slice *back;
   gpr_uint8 *out;
 
@@ -64,7 +64,7 @@
   if (sb->count == 0) goto add_new;
   back = &sb->slices[sb->count - 1];
   if (back->refcount) goto add_new;
-  if (back->data.inlined.length + n > sizeof(back->data.inlined.bytes))
+  if ((back->data.inlined.length + n) > sizeof(back->data.inlined.bytes))
     goto add_new;
   out = back->data.inlined.bytes + back->data.inlined.length;
   back->data.inlined.length += n;
diff --git a/src/core/support/string_posix.c b/src/core/support/string_posix.c
index 7b7e82e..5783281 100644
--- a/src/core/support/string_posix.c
+++ b/src/core/support/string_posix.c
@@ -57,7 +57,7 @@
   va_start(args, format);
   ret = vsnprintf(buf, sizeof(buf), format, args);
   va_end(args);
-  if (!(0 <= ret && ret < ~(size_t)0)) {
+  if (!(0 <= ret)) {
     *strp = NULL;
     return -1;
   }
@@ -79,7 +79,7 @@
   va_start(args, format);
   ret = vsnprintf(*strp, strp_buflen, format, args);
   va_end(args);
-  if (ret == strp_buflen - 1) {
+  if ((size_t)ret == strp_buflen - 1) {
     return ret;
   }
 
diff --git a/src/core/support/thd_posix.c b/src/core/support/thd_posix.c
index 1189e0c..bac1d9c 100644
--- a/src/core/support/thd_posix.c
+++ b/src/core/support/thd_posix.c
@@ -43,6 +43,7 @@
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/thd.h>
+#include <grpc/support/useful.h>
 
 struct thd_arg {
   void (*body)(void *arg); /* body of a thread */
diff --git a/src/core/surface/server_chttp2.c b/src/core/surface/server_chttp2.c
index 47fca82..5ba7d47 100644
--- a/src/core/surface/server_chttp2.c
+++ b/src/core/surface/server_chttp2.c
@@ -75,7 +75,7 @@
   grpc_resolved_addresses *resolved = NULL;
   grpc_tcp_server *tcp = NULL;
   size_t i;
-  int count = 0;
+  unsigned count = 0;
   int port_num = -1;
   int port_temp;
 
diff --git a/src/core/tsi/fake_transport_security.c b/src/core/tsi/fake_transport_security.c
index 0b245e4..a96c7df 100644
--- a/src/core/tsi/fake_transport_security.c
+++ b/src/core/tsi/fake_transport_security.c
@@ -38,6 +38,7 @@
 
 #include <grpc/support/log.h>
 #include <grpc/support/port_platform.h>
+#include <grpc/support/useful.h>
 #include "src/core/tsi/transport_security.h"
 
 /* --- Constants. ---*/
@@ -412,7 +413,7 @@
     tsi_handshaker* self, const unsigned char* bytes, size_t* bytes_size) {
   tsi_result result = TSI_OK;
   tsi_fake_handshaker* impl = (tsi_fake_handshaker*)self;
-  int expected_msg = impl->next_message_to_send - 1;
+  tsi_fake_handshake_message expected_msg = impl->next_message_to_send - 1;
   tsi_fake_handshake_message received_msg;
 
   if (!impl->needs_incoming_message || impl->result == TSI_OK) {
diff --git a/src/core/tsi/ssl_transport_security.c b/src/core/tsi/ssl_transport_security.c
index 8801cc4..0f8cbcc 100644
--- a/src/core/tsi/ssl_transport_security.c
+++ b/src/core/tsi/ssl_transport_security.c
@@ -37,6 +37,7 @@
 
 #include <grpc/support/log.h>
 #include <grpc/support/sync.h>
+#include <grpc/support/useful.h>
 #include "src/core/tsi/transport_security.h"
 
 #include <openssl/bio.h>
@@ -565,7 +566,8 @@
     current += alpn_protocols_lengths[i];
   }
   /* Safety check. */
-  if ((current - *protocol_name_list) != *protocol_name_list_length) {
+  if ((current < *protocol_name_list) ||
+      ((gpr_uintptr)(current - *protocol_name_list) != *protocol_name_list_length)) {
     return TSI_INTERNAL_ERROR;
   }
   return TSI_OK;
@@ -1063,7 +1065,8 @@
   while ((client_current - in) < inlen) {
     unsigned char client_current_len = *(client_current++);
     const unsigned char* server_current = factory->alpn_protocol_list;
-    while ((server_current - factory->alpn_protocol_list) <
+    while ((server_current >= factory->alpn_protocol_list) &&
+           (gpr_uintptr)(server_current - factory->alpn_protocol_list) <
            factory->alpn_protocol_list_length) {
       unsigned char server_current_len = *(server_current++);
       if ((client_current_len == server_current_len) &&
diff --git a/templates/Makefile.template b/templates/Makefile.template
index 6f196eb..142d188 100644
--- a/templates/Makefile.template
+++ b/templates/Makefile.template
@@ -139,7 +139,7 @@
 
 CFLAGS += -std=c89 -pedantic
 CXXFLAGS += -std=c++11
-CPPFLAGS += -g -fPIC -Wall -Wextra -Wno-long-long
+CPPFLAGS += -g -fPIC -Wall -Wextra -Werror -Wno-long-long -Wno-unused-parameter
 LDFLAGS += -g -fPIC
 
 INCLUDES = . include gens
diff --git a/test/core/channel/channel_stack_test.c b/test/core/channel/channel_stack_test.c
index a400fb1..d53098b 100644
--- a/test/core/channel/channel_stack_test.c
+++ b/test/core/channel/channel_stack_test.c
@@ -80,7 +80,7 @@
   const grpc_channel_filter
       filter = {call_func,         channel_func,         sizeof(int),
                 call_init_func,    call_destroy_func,    sizeof(int),
-                channel_init_func, channel_destroy_func, };
+                channel_init_func, channel_destroy_func, "some_test_filter" };
   const grpc_channel_filter *filters = &filter;
   grpc_channel_stack *channel_stack;
   grpc_call_stack *call_stack;
diff --git a/test/core/channel/metadata_buffer_test.c b/test/core/channel/metadata_buffer_test.c
index 9d7e159..6081308 100644
--- a/test/core/channel/metadata_buffer_test.c
+++ b/test/core/channel/metadata_buffer_test.c
@@ -112,12 +112,12 @@
 static const grpc_channel_filter top_filter = {
     fail_call_op,      fail_channel_op,     sizeof(size_t),
     init_call_elem,    destroy_call_elem,   sizeof(channel_data),
-    init_channel_elem, destroy_channel_elem};
+    init_channel_elem, destroy_channel_elem, "top_filter" };
 
 static const grpc_channel_filter bottom_filter = {
     expect_call_op,    fail_channel_op,     sizeof(size_t),
     init_call_elem,    destroy_call_elem,   sizeof(channel_data),
-    init_channel_elem, destroy_channel_elem};
+    init_channel_elem, destroy_channel_elem, "bottom_filter" };
 
 static const grpc_channel_filter *filters[2] = {&top_filter, &bottom_filter};
 
diff --git a/test/core/compression/message_compress_test.c b/test/core/compression/message_compress_test.c
index d1e5935..5f55fa6 100644
--- a/test/core/compression/message_compress_test.c
+++ b/test/core/compression/message_compress_test.c
@@ -166,7 +166,7 @@
 }
 
 int main(int argc, char **argv) {
-  int i, j, k, m;
+  unsigned i, j, k, m;
   grpc_slice_split_mode uncompressed_split_modes[] = {
       GRPC_SLICE_SPLIT_IDENTITY, GRPC_SLICE_SPLIT_ONE_BYTE};
   grpc_slice_split_mode compressed_split_modes[] = {GRPC_SLICE_SPLIT_MERGE_ALL,
diff --git a/test/core/echo/client.c b/test/core/echo/client.c
index 2f35b03..bb478c4 100644
--- a/test/core/echo/client.c
+++ b/test/core/echo/client.c
@@ -66,7 +66,7 @@
   grpc_completion_queue *cq = NULL;
   int bytes_written = 0;
   int bytes_read = 0;
-  int i = 0;
+  unsigned i = 0;
   int waiting_finishes;
   gpr_slice read_slice;
 
diff --git a/test/core/echo/server.c b/test/core/echo/server.c
index 6b67334..2764a9e 100644
--- a/test/core/echo/server.c
+++ b/test/core/echo/server.c
@@ -70,7 +70,7 @@
 static void assert_read_ok(call_state *s, grpc_byte_buffer *b) {
   grpc_byte_buffer_reader *bb_reader = NULL;
   gpr_slice read_slice;
-  int i;
+  unsigned i;
 
   bb_reader = grpc_byte_buffer_reader_create(b);
   while (grpc_byte_buffer_reader_next(bb_reader, &read_slice)) {
diff --git a/test/core/end2end/tests/cancel_after_accept.c b/test/core/end2end/tests/cancel_after_accept.c
index 33aed98..05a2dc8 100644
--- a/test/core/end2end/tests/cancel_after_accept.c
+++ b/test/core/end2end/tests/cancel_after_accept.c
@@ -149,7 +149,7 @@
 }
 
 void grpc_end2end_tests(grpc_end2end_test_config config) {
-  int i;
+  unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) {
     test_cancel_after_accept(config, cancellation_modes[i]);
diff --git a/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c b/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c
index f348488..db245a3 100644
--- a/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c
+++ b/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c
@@ -157,7 +157,7 @@
 }
 
 void grpc_end2end_tests(grpc_end2end_test_config config) {
-  int i;
+  unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) {
     test_cancel_after_accept_and_writes_closed(config, cancellation_modes[i]);
diff --git a/test/core/end2end/tests/cancel_after_invoke.c b/test/core/end2end/tests/cancel_after_invoke.c
index 3bb8672..5dfb3f7 100644
--- a/test/core/end2end/tests/cancel_after_invoke.c
+++ b/test/core/end2end/tests/cancel_after_invoke.c
@@ -132,7 +132,7 @@
 }
 
 void grpc_end2end_tests(grpc_end2end_test_config config) {
-  int i;
+  unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) {
     test_cancel_after_invoke(config, cancellation_modes[i]);
diff --git a/test/core/end2end/tests/cancel_in_a_vacuum.c b/test/core/end2end/tests/cancel_in_a_vacuum.c
index e4f9dee..5257ece 100644
--- a/test/core/end2end/tests/cancel_in_a_vacuum.c
+++ b/test/core/end2end/tests/cancel_in_a_vacuum.c
@@ -122,7 +122,7 @@
 }
 
 void grpc_end2end_tests(grpc_end2end_test_config config) {
-  int i;
+  unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) {
     test_cancel_in_a_vacuum(config, cancellation_modes[i]);
diff --git a/test/core/fling/client.c b/test/core/fling/client.c
index 7947ffe..8f91098 100644
--- a/test/core/fling/client.c
+++ b/test/core/fling/client.c
@@ -103,7 +103,7 @@
 int main(int argc, char **argv) {
   gpr_slice slice = gpr_slice_from_copied_string("x");
   double start, stop;
-  int i;
+  unsigned i;
 
   char *fake_argv[1];
 
diff --git a/test/core/iomgr/resolve_address_test.c b/test/core/iomgr/resolve_address_test.c
index 4cc101b..1f97724 100644
--- a/test/core/iomgr/resolve_address_test.c
+++ b/test/core/iomgr/resolve_address_test.c
@@ -85,7 +85,7 @@
 static void test_ipv6_without_port(void) {
   const char* const kCases[] = {"2001:db8::1", "2001:db8::1.2.3.4",
                                 "[2001:db8::1]", };
-  int i;
+  unsigned i;
   for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
     gpr_event ev;
     gpr_event_init(&ev);
@@ -96,7 +96,7 @@
 
 static void test_invalid_ip_addresses(void) {
   const char* const kCases[] = {"293.283.1238.3:1", "[2001:db8::11111]:1", };
-  int i;
+  unsigned i;
   for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
     gpr_event ev;
     gpr_event_init(&ev);
@@ -108,7 +108,7 @@
 static void test_unparseable_hostports(void) {
   const char* const kCases[] = {"[",         "[::1",        "[::1]bad",
                                 "[1.2.3.4]", "[localhost]", "[localhost]:1", };
-  int i;
+  unsigned i;
   for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
     gpr_event ev;
     gpr_event_init(&ev);
diff --git a/test/core/iomgr/sockaddr_utils_test.c b/test/core/iomgr/sockaddr_utils_test.c
index 3e653da..6cbdc4e 100644
--- a/test/core/iomgr/sockaddr_utils_test.c
+++ b/test/core/iomgr/sockaddr_utils_test.c
@@ -182,7 +182,8 @@
   gpr_log(GPR_INFO, "  expect_sockaddr_str(%s)", expected);
   result = grpc_sockaddr_to_string(&str, (struct sockaddr *)addr, normalize);
   GPR_ASSERT(str != NULL);
-  GPR_ASSERT(result == strlen(str));
+  GPR_ASSERT(result >= 0);
+  GPR_ASSERT((size_t)result == strlen(str));
   GPR_ASSERT(strcmp(expected, str) == 0);
   gpr_free(str);
 }
@@ -194,7 +195,7 @@
 
   gpr_log(GPR_INFO, "%s", __FUNCTION__);
 
-  errno = 0xDEADBEEF;
+  errno = 0x7EADBEEF;
 
   input4 = make_addr4(kIPv4, sizeof(kIPv4));
   expect_sockaddr_str("192.0.2.1:12345", &input4, 0);
@@ -217,7 +218,7 @@
   expect_sockaddr_str("(sockaddr family=123)", &dummy, 0);
   expect_sockaddr_str("(sockaddr family=123)", &dummy, 1);
 
-  GPR_ASSERT(errno == 0xDEADBEEF);
+  GPR_ASSERT(errno == 0x7EADBEEF);
 }
 
 int main(int argc, char **argv) {
diff --git a/test/core/iomgr/tcp_posix_test.c b/test/core/iomgr/tcp_posix_test.c
index 24634b4..f52ae22 100644
--- a/test/core/iomgr/tcp_posix_test.c
+++ b/test/core/iomgr/tcp_posix_test.c
@@ -94,7 +94,7 @@
   ssize_t write_bytes;
   size_t total_bytes = 0;
   unsigned char *buf = malloc(bytes);
-  int i;
+  unsigned i;
   for (i = 0; i < bytes; ++i) {
     buf[i] = i % 256;
   }
@@ -115,15 +115,14 @@
   grpc_endpoint *ep;
   gpr_mu mu;
   gpr_cv cv;
-  size_t read_bytes;
+  ssize_t read_bytes;
   ssize_t target_read_bytes;
 };
 
 static ssize_t count_and_unref_slices(gpr_slice *slices, size_t nslices,
                                       int *current_data) {
   ssize_t num_bytes = 0;
-  int i;
-  int j;
+  unsigned i, j;
   unsigned char *buf;
   for (i = 0; i < nslices; ++i) {
     buf = GPR_SLICE_START_PTR(slices[i]);
@@ -254,8 +253,7 @@
   ssize_t nslices = num_bytes / slice_size + (num_bytes % slice_size ? 1 : 0);
   gpr_slice *slices = gpr_malloc(sizeof(gpr_slice) * nslices);
   ssize_t num_bytes_left = num_bytes;
-  int i;
-  int j;
+  unsigned i, j;
   unsigned char *buf;
   *num_blocks = nslices;
 
diff --git a/test/core/json/json_rewrite.c b/test/core/json/json_rewrite.c
index edece98..a761a67 100644
--- a/test/core/json/json_rewrite.c
+++ b/test/core/json/json_rewrite.c
@@ -131,7 +131,7 @@
 }
 
 static gpr_uint32 json_reader_read_char(void* userdata) {
-  gpr_uint32 r;
+  int r;
   json_reader_userdata* state = userdata;
 
   r = fgetc(state->in);
diff --git a/test/core/json/json_rewrite_test.c b/test/core/json/json_rewrite_test.c
index e47a418..4ce406c 100644
--- a/test/core/json/json_rewrite_test.c
+++ b/test/core/json/json_rewrite_test.c
@@ -138,7 +138,7 @@
 }
 
 static gpr_uint32 json_reader_read_char(void* userdata) {
-  gpr_uint32 r;
+  int r;
   json_reader_userdata* state = userdata;
 
   if (!state->did_eagain) {
@@ -298,7 +298,7 @@
 };
 
 void test_rewrites() {
-  int i;
+  unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(test_files); i++) {
     test_file* test = test_files + i;
diff --git a/test/core/json/json_test.c b/test/core/json/json_test.c
index c234eb9..11659a5 100644
--- a/test/core/json/json_test.c
+++ b/test/core/json/json_test.c
@@ -124,7 +124,7 @@
 };
 
 static void test_pairs() {
-  int i;
+  unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(testing_pairs); i++) {
     testing_pair* pair = testing_pairs + i;
diff --git a/test/core/security/secure_endpoint_test.c b/test/core/security/secure_endpoint_test.c
index 5d87502..456515b 100644
--- a/test/core/security/secure_endpoint_test.c
+++ b/test/core/security/secure_endpoint_test.c
@@ -59,7 +59,7 @@
     f.client_ep =
         grpc_secure_endpoint_create(fake_read_protector, tcp.client, NULL, 0);
   } else {
-    int i;
+    unsigned i;
     tsi_result result;
     size_t still_pending_size;
     size_t total_buffer_size = 8192;
@@ -81,9 +81,8 @@
         message_bytes += processed_message_size;
         message_size -= processed_message_size;
         cur += protected_buffer_size_to_send;
+        GPR_ASSERT(buffer_size >= protected_buffer_size_to_send);
         buffer_size -= protected_buffer_size_to_send;
-
-        GPR_ASSERT(buffer_size >= 0);
       }
       gpr_slice_unref(plain);
     }
@@ -94,8 +93,8 @@
                                                  &still_pending_size);
       GPR_ASSERT(result == TSI_OK);
       cur += protected_buffer_size_to_send;
+      GPR_ASSERT(buffer_size >= protected_buffer_size_to_send);
       buffer_size -= protected_buffer_size_to_send;
-      GPR_ASSERT(buffer_size >= 0);
     } while (still_pending_size > 0);
     encrypted_leftover = gpr_slice_from_copied_buffer(
         (const char *)encrypted_buffer, total_buffer_size - buffer_size);
diff --git a/test/core/statistics/census_log_tests.c b/test/core/statistics/census_log_tests.c
index ca2d1de..c7b2b2e 100644
--- a/test/core/statistics/census_log_tests.c
+++ b/test/core/statistics/census_log_tests.c
@@ -415,8 +415,8 @@
 /* Tries reading beyond pending write. */
 void test_read_beyond_pending_record(void) {
   /* Start a write. */
-  gpr_int32 incomplete_record_size = 10;
-  gpr_int32 complete_record_size = 20;
+  gpr_uint32 incomplete_record_size = 10;
+  gpr_uint32 complete_record_size = 20;
   size_t bytes_available;
   void* complete_record;
   const void* record_read;
@@ -457,7 +457,7 @@
   size_t bytes_available;
   const void* record_read;
   void* record_written;
-  gpr_int32 block_read = 0;
+  gpr_uint32 block_read = 0;
   printf("Starting test: detached while reading\n");
   setup_test(0);
   /* Start a write. */
diff --git a/test/core/statistics/hash_table_test.c b/test/core/statistics/hash_table_test.c
index f8df257..e8e4d8b 100644
--- a/test/core/statistics/hash_table_test.c
+++ b/test/core/statistics/hash_table_test.c
@@ -190,7 +190,7 @@
   census_ht* ht = census_ht_create(&opt);
   char key_str[1000][GPR_LTOA_MIN_BUFSIZE];
   gpr_uint64 val = 0;
-  int i = 0;
+  unsigned i = 0;
   for (i = 0; i < 1000; i++) {
     census_ht_key key;
     key.ptr = key_str[i];
diff --git a/test/core/support/host_port_test.c b/test/core/support/host_port_test.c
index 5b06b70..6d14fab 100644
--- a/test/core/support/host_port_test.c
+++ b/test/core/support/host_port_test.c
@@ -43,7 +43,8 @@
   char *buf;
   int len;
   len = gpr_join_host_port(&buf, host, port);
-  GPR_ASSERT(strlen(expected) == len);
+  GPR_ASSERT(len >= 0);
+  GPR_ASSERT(strlen(expected) == (size_t)len);
   GPR_ASSERT(strcmp(expected, buf) == 0);
   gpr_free(buf);
 }
diff --git a/test/core/support/slice_test.c b/test/core/support/slice_test.c
index 2a7056f..469d7de 100644
--- a/test/core/support/slice_test.c
+++ b/test/core/support/slice_test.c
@@ -103,10 +103,10 @@
   GPR_ASSERT(do_nothing_with_len_1_calls == 1);
 }
 
-static void test_slice_sub_works(int length) {
+static void test_slice_sub_works(unsigned length) {
   gpr_slice slice;
   gpr_slice sub;
-  int i, j, k;
+  unsigned i, j, k;
 
   LOG_TEST_NAME();
   gpr_log(GPR_INFO, "length=%d", length);
@@ -212,7 +212,7 @@
 }
 
 int main(int argc, char **argv) {
-  int length;
+  unsigned length;
   grpc_test_init(argc, argv);
   test_slice_malloc_returns_something_sensible();
   test_slice_new_returns_something_sensible();
diff --git a/test/core/surface/completion_queue_test.c b/test/core/surface/completion_queue_test.c
index 71f9cc2..dc459d6 100644
--- a/test/core/surface/completion_queue_test.c
+++ b/test/core/surface/completion_queue_test.c
@@ -214,7 +214,7 @@
   grpc_event *ev;
   grpc_completion_queue *cc;
   void *tags[128];
-  int i, j;
+  unsigned i, j;
   int on_finish_called = 0;
 
   LOG_TEST();
diff --git a/test/core/transport/chttp2/timeout_encoding_test.c b/test/core/transport/chttp2/timeout_encoding_test.c
index 0ad90db..56a1e6e 100644
--- a/test/core/transport/chttp2/timeout_encoding_test.c
+++ b/test/core/transport/chttp2/timeout_encoding_test.c
@@ -94,7 +94,7 @@
   long test_vals[] = {1,       12,       123,       1234,     12345,   123456,
                       1234567, 12345678, 123456789, 98765432, 9876543, 987654,
                       98765,   9876,     987,       98,       9};
-  int i;
+  unsigned i;
   char *input;
   for (i = 0; i < GPR_ARRAY_SIZE(test_vals); i++) {
     gpr_asprintf(&input, "%ld%c", test_vals[i], ext);
diff --git a/test/core/transport/stream_op_test.c b/test/core/transport/stream_op_test.c
index 0d1122c..e6649ec 100644
--- a/test/core/transport/stream_op_test.c
+++ b/test/core/transport/stream_op_test.c
@@ -61,7 +61,7 @@
   gpr_slice test_slice_3 = gpr_slice_malloc(3);
   gpr_slice test_slice_4 = gpr_slice_malloc(4);
   char x;
-  int i;
+  unsigned i;
 
   grpc_stream_op_buffer buf;
   grpc_stream_op_buffer buf2;
diff --git a/test/core/transport/transport_end2end_tests.c b/test/core/transport/transport_end2end_tests.c
index 25276c0..2cd033b 100644
--- a/test/core/transport/transport_end2end_tests.c
+++ b/test/core/transport/transport_end2end_tests.c
@@ -913,7 +913,7 @@
                                                      100000, 1000000, };
 
 void grpc_transport_end2end_tests(grpc_transport_test_config *config) {
-  int i;
+  unsigned i;
 
   g_metadata_context = grpc_mdctx_create();