Windows: Address MSVC Level 4 & WDK's OACR/Prefast 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/Prefast error related to the use of strncpy in xusb.c
* Also fixes whitespace inconsistencies in core
* Issues reported by Orin Eman and Xiaofan Chen. See:
  https://sourceforge.net/mailarchive/message.php?msg_id=29412656
This commit is contained in:
Pete Batard 2012-06-25 19:13:42 +01:00
parent 89b43a6929
commit 0e0cbb6c27
10 changed files with 57 additions and 40 deletions

View file

@ -935,7 +935,10 @@ int main(int argc, char** argv)
break; break;
case 'b': case 'b':
if (j+1 < argc) { if (j+1 < argc) {
strncpy(binary_name, argv[j+1], 64); // WDK's OACR doesn't like strncpy...
for (i=0; (i<(sizeof(binary_name)-1)) && (argv[j+1][i] != 0); i++)
binary_name[i] = argv[j+1][i];
binary_name[i] = 0;
j++; j++;
} }
binary_dump = true; binary_dump = true;

View file

@ -1611,7 +1611,7 @@ void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level)
*/ */
int API_EXPORTED libusb_init(libusb_context **context) int API_EXPORTED libusb_init(libusb_context **context)
{ {
char *dbg = getenv("LIBUSB_DEBUG"); char *dbg;
struct libusb_context *ctx; struct libusb_context *ctx;
int r = 0; int r = 0;
@ -1639,6 +1639,7 @@ int API_EXPORTED libusb_init(libusb_context **context)
ctx->debug = LOG_LEVEL_DEBUG; ctx->debug = LOG_LEVEL_DEBUG;
#endif #endif
dbg = getenv("LIBUSB_DEBUG");
if (dbg) { if (dbg) {
ctx->debug = atoi(dbg); ctx->debug = atoi(dbg);
if (ctx->debug) if (ctx->debug)
@ -1774,14 +1775,14 @@ int API_EXPORTED libusb_has_capability(uint32_t capability)
#define _W32_FT_OFFSET (116444736000000000) #define _W32_FT_OFFSET (116444736000000000)
int usbi_gettimeofday(struct timeval *tp, void *tzp) int usbi_gettimeofday(struct timeval *tp, void *tzp)
{ {
union { union {
unsigned __int64 ns100; /*time since 1 Jan 1601 in 100ns units */ unsigned __int64 ns100; /* Time since 1 Jan 1601, in 100ns units */
FILETIME ft; FILETIME ft;
} _now; } _now;
UNUSED(tzp);
if(tp) if(tp) {
{
GetSystemTimeAsFileTime (&_now.ft); GetSystemTimeAsFileTime (&_now.ft);
tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 ); tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 );
tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000); tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000);

View file

@ -49,6 +49,9 @@
#define USB_MAXINTERFACES 32 #define USB_MAXINTERFACES 32
#define USB_MAXCONFIG 8 #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 {
struct list_head *prev, *next; struct list_head *prev, *next;
}; };

View file

@ -139,7 +139,7 @@ void init_polling(void)
} }
is_polling_set = TRUE; is_polling_set = TRUE;
} }
compat_spinlock = 0; InterlockedExchange((LONG *)&compat_spinlock, 0);
} }
// Internal function to retrieve the table index (and lock the fd mutex) // 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); 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) ssize_t usbi_write(int fd, const void *buf, size_t count)
{ {
int _index; int _index;
UNUSED(buf);
CHECK_INIT_POLLING; CHECK_INIT_POLLING;
@ -708,6 +709,7 @@ ssize_t usbi_read(int fd, void *buf, size_t count)
{ {
int _index; int _index;
ssize_t r = -1; ssize_t r = -1;
UNUSED(buf);
CHECK_INIT_POLLING; CHECK_INIT_POLLING;

View file

@ -28,6 +28,7 @@
int usbi_mutex_init(usbi_mutex_t *mutex, int usbi_mutex_init(usbi_mutex_t *mutex,
const usbi_mutexattr_t *attr) { const usbi_mutexattr_t *attr) {
UNUSED(attr);
if(! mutex) return ((errno=EINVAL)); if(! mutex) return ((errno=EINVAL));
*mutex = CreateMutex(NULL, FALSE, NULL); *mutex = CreateMutex(NULL, FALSE, NULL);
if(!*mutex) return ((errno=ENOMEM)); 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, int usbi_cond_init(usbi_cond_t *cond,
const usbi_condattr_t *attr) { const usbi_condattr_t *attr) {
UNUSED(attr);
if(!cond) return ((errno=EINVAL)); if(!cond) return ((errno=EINVAL));
list_init(&cond->waiters ); list_init(&cond->waiters );
list_init(&cond->not_waiting); list_init(&cond->not_waiting);

View file

@ -38,11 +38,6 @@
#include "poll_windows.h" #include "poll_windows.h"
#include "windows_usb.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. // The 2 macros below are used in conjunction with safe loops.
#define LOOP_CHECK(fcall) { r=fcall; if (r != LIBUSB_SUCCESS) continue; } #define LOOP_CHECK(fcall) { r=fcall; if (r != LIBUSB_SUCCESS) continue; }
#define LOOP_BREAK(err) { r=err; continue; } #define LOOP_BREAK(err) { r=err; continue; }
@ -455,7 +450,7 @@ static unsigned long htab_hash(char* str)
char* sz = str; char* sz = str;
// Compute main hash value (algorithm suggested by Nokia) // Compute main hash value (algorithm suggested by Nokia)
while ((c = *sz++)) while ((c = *sz++) != 0)
r = ((r << 5) + r) + c; r = ((r << 5) + r) + c;
if (r == 0) if (r == 0)
++r; ++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]; priv->usb_interface[interface_number].apib = &usb_api_backend[api];
if ((api == USB_API_HID) && (priv->hid == NULL)) { if ((api == USB_API_HID) && (priv->hid == NULL)) {
priv->hid = calloc(1, sizeof(struct hid_device_priv)); priv->hid = calloc(1, sizeof(struct hid_device_priv));
if (priv->hid == NULL)
return LIBUSB_ERROR_NO_MEM;
} }
priv->composite_api_flags |= 1<<api; 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; struct discovered_devs *discdevs;
HDEVINFO dev_info = { 0 }; HDEVINFO dev_info = { 0 };
char* usb_class[2] = {"USB", "NUSB3"}; 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; SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL;
GUID hid_guid; GUID hid_guid;
#define MAX_ENUM_GUIDS 64 #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; char* dev_id_path = NULL;
unsigned long session_id; unsigned long session_id;
DWORD size, reg_type, port_nr, install_state; DWORD size, reg_type, port_nr, install_state;
BOOL b = FALSE;
HKEY key; HKEY key;
WCHAR guid_string_w[MAX_GUID_STRING_LENGTH]; WCHAR guid_string_w[MAX_GUID_STRING_LENGTH];
GUID* if_guid; GUID* if_guid;
@ -1333,12 +1329,13 @@ static int windows_get_device_list(struct libusb_context *ctx, struct discovered
} else { } else {
// Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are // 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" // being listed under the "NUSB3" PnP Symbolic Name rather than "USB"
while ( (class_index < 2) && for (; class_index < 2; class_index++) {
(!(b = get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i))) ) { if (get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i))
class_index++; break;
i = 0; i = 0;
} }
if (!b) break; if (class_index >= 2)
break;
} }
// Read the Device ID path. This is what we'll use as UID // Read the Device ID path. This is what we'll use as UID

View file

@ -1 +1 @@
#define LIBUSB_NANO 10534 #define LIBUSB_NANO 10535

View file

@ -5,6 +5,15 @@
#error "Please make sure the msvc/ directory is removed from your build path." #error "Please make sure the msvc/ directory is removed from your build path."
#endif #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 */ /* Default visibility */
#define DEFAULT_VISIBILITY /**/ #define DEFAULT_VISIBILITY /**/

View file

@ -79,7 +79,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile> </ClCompile>
<Link> <Link>
@ -98,7 +98,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_WIN64;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_WIN64;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile> </ClCompile>
<Link> <Link>
@ -113,7 +113,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
</ClCompile> </ClCompile>
<Link> <Link>
<OutputFile>$(OutDir)libusb-1.0.dll</OutputFile> <OutputFile>$(OutDir)libusb-1.0.dll</OutputFile>
@ -129,7 +129,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
</ClCompile> </ClCompile>
<Link> <Link>
<OutputFile>$(OutDir)libusb-1.0.dll</OutputFile> <OutputFile>$(OutDir)libusb-1.0.dll</OutputFile>

View file

@ -79,7 +79,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile> </ClCompile>
<Lib> <Lib>
@ -95,7 +95,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_WIN64;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_WIN64;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile> </ClCompile>
<Lib> <Lib>
@ -107,7 +107,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
</ClCompile> </ClCompile>
<Lib> <Lib>
<OutputFile>$(OutDir)libusb-1.0.lib</OutputFile> <OutputFile>$(OutDir)libusb-1.0.lib</OutputFile>
@ -121,7 +121,7 @@
<AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level4</WarningLevel>
</ClCompile> </ClCompile>
<Lib> <Lib>
<OutputFile>$(OutDir)libusb-1.0.lib</OutputFile> <OutputFile>$(OutDir)libusb-1.0.lib</OutputFile>