On 2012.06.25 23:45, Pete Batard wrote:
- The only real controversial addon is that "if (!dbg) UNUSED(dbg);" in
libusb_init(), which is only there be OACR insists on wanting that
variable tested no matter what, before exiting the call. I thought about
somehow concealing this farce with a debug statement indicating whether
the LIBUSB_DEBUG environmental variable existed... but that would be
rather useless as such a debug statement would never appear unless you
compile with forced debug (no context yet), and if you do, and knowing
the status of LIBUSB_DEBUG becomes pointless anyway.

Not thinking straight here, which I guess is what happens when you've been spending too much time addressing warnings. Of course the proper way to address this is to assign the dbg variable just before the test, and not sooner.

v2 of the patch attached.

Regards,

/Pete
>From d377770c5d6f4534df94bbd88f5ae8c3b3ccb824 Mon Sep 17 00:00:00 2001
From: Pete Batard <p...@akeo.ie>
Date: Mon, 25 Jun 2012 19:13:42 +0100
Subject: [PATCH] Windows: Address MSVC Level 4 & WDK's OACR warnings

* The library is now compiled with warning level 4 for VS2010
* Move silencing of 4200, 28125 and 28719 to msvc/config.h
* Add fixes in core to silence unused variables warnings
* Ensure that spinlock is always set interlocked in poll_windows
* Add missing check for calloc return value
* Fix data assignation in conditionals warnings
* Fix an OACR error related to the use of strncpy in xusb.c
* Also fixes whitespace inconsistencies in core
---
 examples/xusb.c             |    5 ++++-
 libusb/core.c               |   33 +++++++++++++++++----------------
 libusb/libusbi.h            |    3 +++
 libusb/os/poll_windows.c    |    6 ++++--
 libusb/os/threads_windows.c |    2 ++
 libusb/os/windows_usb.c     |   23 ++++++++++-------------
 msvc/config.h               |    9 +++++++++
 msvc/libusb_dll.vcxproj     |    8 ++++----
 msvc/libusb_static.vcxproj  |    8 ++++----
 9 files changed, 58 insertions(+), 41 deletions(-)

diff --git a/examples/xusb.c b/examples/xusb.c
index 8e09e05..b667c72 100644
--- a/examples/xusb.c
+++ b/examples/xusb.c
@@ -935,7 +935,10 @@ int main(int argc, char** argv)
                                        break;
                                case 'b':
                                        if (j+1 < argc) {
-                                               strncpy(binary_name, argv[j+1], 
64);
+                                               // WDK's OACR doesn't like 
strncpy...
+                                               for (i=0; (i<63) && 
(argv[j+1][i] != 0); i++)
+                                                       binary_name[i] = 
argv[j+1][i];
+                                               binary_name[i] = 0;
                                                j++;
                                        }
                                        binary_dump = true;
diff --git a/libusb/core.c b/libusb/core.c
index dd352f9..82cf782 100644
--- a/libusb/core.c
+++ b/libusb/core.c
@@ -1611,7 +1611,7 @@ void API_EXPORTED libusb_set_debug(libusb_context *ctx, 
int level)
  */
 int API_EXPORTED libusb_init(libusb_context **context)
 {
-       char *dbg = getenv("LIBUSB_DEBUG");
+       char *dbg;
        struct libusb_context *ctx;
        int r = 0;
 
@@ -1639,6 +1639,7 @@ int API_EXPORTED libusb_init(libusb_context **context)
        ctx->debug = LOG_LEVEL_DEBUG;
 #endif
 
+       dbg = getenv("LIBUSB_DEBUG");
        if (dbg) {
                ctx->debug = atoi(dbg);
                if (ctx->debug)
@@ -1774,21 +1775,21 @@ int API_EXPORTED libusb_has_capability(uint32_t 
capability)
 #define _W32_FT_OFFSET (116444736000000000)
 
 int usbi_gettimeofday(struct timeval *tp, void *tzp)
- {
-  union {
-    unsigned __int64 ns100; /*time since 1 Jan 1601 in 100ns units */
-    FILETIME ft;
-  }  _now;
-
-  if(tp)
-    {
-      GetSystemTimeAsFileTime (&_now.ft);
-      tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 );
-      tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000);
-    }
-  /* Always return 0 as per Open Group Base Specifications Issue 6.
-     Do not set errno on error.  */
-  return 0;
+{
+       union {
+               unsigned __int64 ns100; /* Time since 1 Jan 1601, in 100ns 
units */
+               FILETIME ft;
+       } _now;
+       UNUSED(tzp);
+
+       if(tp) {
+               GetSystemTimeAsFileTime (&_now.ft);
+               tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 );
+               tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000);
+       }
+       /* Always return 0 as per Open Group Base Specifications Issue 6.
+          Do not set errno on error.  */
+       return 0;
 }
 #endif
 
diff --git a/libusb/libusbi.h b/libusb/libusbi.h
index 41a6bf0..27362f7 100644
--- a/libusb/libusbi.h
+++ b/libusb/libusbi.h
@@ -49,6 +49,9 @@
 #define USB_MAXINTERFACES      32
 #define USB_MAXCONFIG          8
 
+/* The following is used to silence warnings for unused variables */
+#define UNUSED(var)                    (void)sizeof(var)
+
 struct list_head {
        struct list_head *prev, *next;
 };
diff --git a/libusb/os/poll_windows.c b/libusb/os/poll_windows.c
index e7bd8c5..4601a79 100644
--- a/libusb/os/poll_windows.c
+++ b/libusb/os/poll_windows.c
@@ -139,7 +139,7 @@ void init_polling(void)
                }
                is_polling_set = TRUE;
        }
-       compat_spinlock = 0;
+       InterlockedExchange((LONG *)&compat_spinlock, 0);
 }
 
 // Internal function to retrieve the table index (and lock the fd mutex)
@@ -237,7 +237,7 @@ void exit_polling(void)
                        DeleteCriticalSection(&_poll_fd[i].mutex);
                }
        }
-       compat_spinlock = 0;
+       InterlockedExchange((LONG *)&compat_spinlock, 0);
 }
 
 /*
@@ -672,6 +672,7 @@ int usbi_close(int fd)
 ssize_t usbi_write(int fd, const void *buf, size_t count)
 {
        int _index;
+       UNUSED(buf);
 
        CHECK_INIT_POLLING;
 
@@ -708,6 +709,7 @@ ssize_t usbi_read(int fd, void *buf, size_t count)
 {
        int _index;
        ssize_t r = -1;
+       UNUSED(buf);
 
        CHECK_INIT_POLLING;
 
diff --git a/libusb/os/threads_windows.c b/libusb/os/threads_windows.c
index 4acfff6..aa05edc 100644
--- a/libusb/os/threads_windows.c
+++ b/libusb/os/threads_windows.c
@@ -28,6 +28,7 @@
 
 int usbi_mutex_init(usbi_mutex_t *mutex,
                                        const usbi_mutexattr_t *attr) {
+       UNUSED(attr);
        if(! mutex) return ((errno=EINVAL));
        *mutex = CreateMutex(NULL, FALSE, NULL);
        if(!*mutex) return ((errno=ENOMEM));
@@ -83,6 +84,7 @@ int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) {
 
 int usbi_cond_init(usbi_cond_t *cond,
                                   const usbi_condattr_t *attr) {
+       UNUSED(attr);
        if(!cond)           return ((errno=EINVAL));
        list_init(&cond->waiters    );
        list_init(&cond->not_waiting);
diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c
index 9b30e2d..3b90d18 100644
--- a/libusb/os/windows_usb.c
+++ b/libusb/os/windows_usb.c
@@ -38,11 +38,6 @@
 #include "poll_windows.h"
 #include "windows_usb.h"
 
-// The following prevents "banned API" errors when using the MS's WDK 
OACR/Prefast
-#if defined(_PREFAST_)
-#pragma warning(disable:28719)
-#endif
-
 // The 2 macros below are used in conjunction with safe loops.
 #define LOOP_CHECK(fcall) { r=fcall; if (r != LIBUSB_SUCCESS) continue; }
 #define LOOP_BREAK(err) { r=err; continue; }
@@ -455,7 +450,7 @@ static unsigned long htab_hash(char* str)
        char* sz = str;
 
        // Compute main hash value (algorithm suggested by Nokia)
-       while ((c = *sz++))
+       while ((c = *sz++) != 0)
                r = ((r << 5) + r) + c;
        if (r == 0)
                ++r;
@@ -1193,6 +1188,8 @@ static int set_composite_interface(struct libusb_context* 
ctx, struct libusb_dev
        priv->usb_interface[interface_number].apib = &usb_api_backend[api];
        if ((api == USB_API_HID) && (priv->hid == NULL)) {
                priv->hid = calloc(1, sizeof(struct hid_device_priv));
+               if (priv->hid == NULL)
+                       return LIBUSB_ERROR_NO_MEM;
        }
        priv->composite_api_flags |= 1<<api;
 
@@ -1223,7 +1220,7 @@ static int windows_get_device_list(struct libusb_context 
*ctx, struct discovered
        struct discovered_devs *discdevs;
        HDEVINFO dev_info = { 0 };
        char* usb_class[2] = {"USB", "NUSB3"};
-       SP_DEVINFO_DATA dev_info_data;
+       SP_DEVINFO_DATA dev_info_data = { 0 };
        SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL;
        GUID hid_guid;
 #define MAX_ENUM_GUIDS 64
@@ -1244,7 +1241,6 @@ static int windows_get_device_list(struct libusb_context 
*ctx, struct discovered
        char* dev_id_path = NULL;
        unsigned long session_id;
        DWORD size, reg_type, port_nr, install_state;
-       BOOL b = FALSE;
        HKEY key;
        WCHAR guid_string_w[MAX_GUID_STRING_LENGTH];
        GUID* if_guid;
@@ -1333,12 +1329,13 @@ static int windows_get_device_list(struct 
libusb_context *ctx, struct discovered
                        } else {
                                // Workaround for a Nec/Renesas USB 3.0 driver 
bug where root hubs are
                                // being listed under the "NUSB3" PnP Symbolic 
Name rather than "USB"
-                               while ( (class_index < 2) &&
-                                           (!(b = get_devinfo_data(ctx, 
&dev_info, &dev_info_data, usb_class[class_index], i))) ) {
-                                               class_index++;
-                                               i = 0;
+                               for (; class_index < 2; class_index++) {
+                                       if (get_devinfo_data(ctx, &dev_info, 
&dev_info_data, usb_class[class_index], i))
+                                               break;
+                                       i = 0;
                                }
-                               if (!b) break;
+                               if (class_index >= 2)
+                                       break;
                        }
 
                        // Read the Device ID path. This is what we'll use as 
UID
diff --git a/msvc/config.h b/msvc/config.h
index e14d91d..e221bab 100644
--- a/msvc/config.h
+++ b/msvc/config.h
@@ -5,6 +5,15 @@
 #error "Please make sure the msvc/ directory is removed from your build path."
 #endif
 
+/* Disable: warning C4200: nonstandard extension used : zero-sized array in 
struct/union */
+#pragma warning(disable:4200)
+#if defined(_PREFAST_)
+/* Disable "Banned API" errors when using the MS's WDK OACR/Prefast */
+#pragma warning(disable:28719)
+/* Disable "The function 'InitializeCriticalSection' must be called from 
within a try/except block" */
+#pragma warning(disable:28125)
+#endif
+
 /* Default visibility */
 #define DEFAULT_VISIBILITY /**/
 
diff --git a/msvc/libusb_dll.vcxproj b/msvc/libusb_dll.vcxproj
index 521c613..f1881fe 100644
--- a/msvc/libusb_dll.vcxproj
+++ b/msvc/libusb_dll.vcxproj
@@ -79,7 +79,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
@@ -98,7 +98,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_WIN64;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
@@ -113,7 +113,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
     </ClCompile>
     <Link>
       <OutputFile>$(OutDir)libusb-1.0.dll</OutputFile>
@@ -129,7 +129,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
     </ClCompile>
     <Link>
       <OutputFile>$(OutDir)libusb-1.0.dll</OutputFile>
diff --git a/msvc/libusb_static.vcxproj b/msvc/libusb_static.vcxproj
index 9cb482d..57254be 100644
--- a/msvc/libusb_static.vcxproj
+++ b/msvc/libusb_static.vcxproj
@@ -79,7 +79,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Lib>
@@ -95,7 +95,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_WIN64;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Lib>
@@ -107,7 +107,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
     </ClCompile>
     <Lib>
       <OutputFile>$(OutDir)libusb-1.0.lib</OutputFile>
@@ -121,7 +121,7 @@
       
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       
<PreprocessorDefinitions>_WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
     </ClCompile>
     <Lib>
       <OutputFile>$(OutDir)libusb-1.0.lib</OutputFile>
-- 
1.7.10.msysgit.1

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
libusbx-devel mailing list
libusbx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libusbx-devel

Reply via email to