]> git.kaiwu.me - nginx.git/commitdiff
Win32: support 64-bit compilation with MSVC.
authorMaxim Dounin <mdounin@mdounin.ru>
Sat, 24 Dec 2016 15:01:14 +0000 (18:01 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Sat, 24 Dec 2016 15:01:14 +0000 (18:01 +0300)
There are lots of C4244 warnings (conversion from 'type1' to 'type2',
possible loss of data), so they were disabled.

The same applies to C4267 warnings (conversion from 'size_t' to 'type',
possible loss of data), most notably - conversion from ngx_str_t.len to
ngx_variable_value_t.len (which is unsigned:28).  Additionally, there
is at least one case when it is not possible to fix the warning properly
without introducing win32-specific code: recv() on win32 uses "int len",
while POSIX defines "size_t len".

The ssize_t type now properly defined for 64-bit compilation with MSVC.
Caught by warning C4305 (truncation from '__int64' to 'ssize_t'), on
"cutoff = NGX_MAX_SIZE_T_VALUE / 10" in ngx_atosz()).

Several C4334 warnings (result of 32-bit shift implicitly converted to 64 bits)
were fixed by adding explicit conversions.

Several C4214 warnings (nonstandard extension used: bit field types other
than int) in ngx_http_script.h fixed by changing bit field types from
uintptr_t to unsigned.

src/core/ngx_slab.c
src/http/ngx_http_script.c
src/http/ngx_http_script.h
src/os/win32/ngx_win32_config.h

index 66faecc74b0df21fea654c68a6e9c388924f9411..1d4ce2b67f6da5486bc364d6dde2442f54bbca45 100644 (file)
@@ -101,7 +101,7 @@ ngx_slab_init(ngx_slab_pool_t *pool)
     }
     /**/
 
-    pool->min_size = 1 << pool->min_shift;
+    pool->min_size = (size_t) 1 << pool->min_shift;
 
     slots = ngx_slab_slots(pool);
 
@@ -473,7 +473,7 @@ ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p)
     case NGX_SLAB_SMALL:
 
         shift = slab & NGX_SLAB_SHIFT_MASK;
-        size = 1 << shift;
+        size = (size_t) 1 << shift;
 
         if ((uintptr_t) p & (size - 1)) {
             goto wrong_chunk;
@@ -568,7 +568,7 @@ ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p)
     case NGX_SLAB_BIG:
 
         shift = slab & NGX_SLAB_SHIFT_MASK;
-        size = 1 << shift;
+        size = (size_t) 1 << shift;
 
         if ((uintptr_t) p & (size - 1)) {
             goto wrong_chunk;
index c2b165801a0e2a4f443c42c44e7bb4aa0c67f2ab..c1a0b4c560b176077f66542096f60a94862ef37a 100644 (file)
@@ -356,11 +356,11 @@ ngx_http_script_compile(ngx_http_script_compile_t *sc)
 
                 n = sc->source->data[i] - '0';
 
-                if (sc->captures_mask & (1 << n)) {
+                if (sc->captures_mask & ((ngx_uint_t) 1 << n)) {
                     sc->dup_capture = 1;
                 }
 
-                sc->captures_mask |= 1 << n;
+                sc->captures_mask |= (ngx_uint_t) 1 << n;
 
                 if (ngx_http_script_add_capture_code(sc, n) != NGX_OK) {
                     return NGX_ERROR;
index 46592ab01553402718a1a1dca2cffa879c6098ed..a5116d747617fde32cd410c686ac478f296e59a2 100644 (file)
@@ -121,16 +121,16 @@ typedef struct {
     uintptr_t                   status;
     uintptr_t                   next;
 
-    uintptr_t                   test:1;
-    uintptr_t                   negative_test:1;
-    uintptr_t                   uri:1;
-    uintptr_t                   args:1;
+    unsigned                    test:1;
+    unsigned                    negative_test:1;
+    unsigned                    uri:1;
+    unsigned                    args:1;
 
     /* add the r->args to the new arguments */
-    uintptr_t                   add_args:1;
+    unsigned                    add_args:1;
 
-    uintptr_t                   redirect:1;
-    uintptr_t                   break_cycle:1;
+    unsigned                    redirect:1;
+    unsigned                    break_cycle:1;
 
     ngx_str_t                   name;
 } ngx_http_script_regex_code_t;
@@ -139,13 +139,13 @@ typedef struct {
 typedef struct {
     ngx_http_script_code_pt     code;
 
-    uintptr_t                   uri:1;
-    uintptr_t                   args:1;
+    unsigned                    uri:1;
+    unsigned                    args:1;
 
     /* add the r->args to the new arguments */
-    uintptr_t                   add_args:1;
+    unsigned                    add_args:1;
 
-    uintptr_t                   redirect:1;
+    unsigned                    redirect:1;
 } ngx_http_script_regex_end_code_t;
 
 #endif
index c5e26dcbd98fa63bfbff12ef81da990b5fa798a8..3897730a190d36cd2c7bc05798f7f64d51d47ffd 100644 (file)
@@ -94,6 +94,12 @@ typedef long  time_t;
 /* FD_SET() and FD_CLR(): conditional expression is constant */
 #pragma warning(disable:4127)
 
+/* conversion from 'type1' to 'type2', possible loss of data */
+#pragma warning(disable:4244)
+
+/* conversion from 'size_t' to 'type', possible loss of data */
+#pragma warning(disable:4267)
+
 /* array is too small to include a terminating null character */
 #pragma warning(disable:4295)
 
@@ -189,8 +195,12 @@ typedef unsigned int        ino_t;
 
 
 #ifndef __GNUC__
+#ifdef _WIN64
+typedef __int64             ssize_t;
+#else
 typedef int                 ssize_t;
 #endif
+#endif
 
 
 typedef uint32_t            in_addr_t;