From 4d72a19b18ddde5394491a7c1e9b4b32662a1e5d Mon Sep 17 00:00:00 2001 From: Daniel Wendt Date: Tue, 13 Mar 2018 11:25:16 +0100 Subject: [PATCH] Enable "unused result" warning for MSVC Compiler (Visual Studio >= 2012, MSVC 11.0) After researching the Internet, the annotation should be used in declaration and implementation. After own tests with the MSVC 2012 compiler it is sufficient to use the annotation only in the declaration to get a compiler warning, as with the GCC compiler. So the annotation is not necessary in the C implementation. Bug:https://bugs.freedesktop.org/show_bug.cgi?id=105460 --- cmake/CMakeLists.txt | 7 +++++++ dbus/dbus-internals.h | 5 +++-- dbus/dbus-macros.h | 29 ++++++++++++++++++++++++----- dbus/dbus-sysdeps.h | 4 +++- dbus/dbus-userdb.h | 2 +- test/test-utils.h | 8 ++++---- 6 files changed, 42 insertions(+), 13 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 6349adb..f43b80d 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -176,6 +176,7 @@ if(MSVC) ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /FIconfig.h") SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /FIconfig.h") + option (DBUS_MSVC_CODEANALYZE "Enable code analyzing for MSVC compiler: /analyze" OFF) endif() # @@ -218,6 +219,9 @@ if(MSVC) # 4114 same type qualifier used more than once # 4133 'type' : incompatible types - from 'type1' to 'type2' set(WARNINGS_ERRORS "4002 4003 4013 4028 4031 4047 4114 4133") + if(DBUS_MSVC_CODEANALYZE AND MSVC_VERSION GREATER 1600 AND ${CMAKE_BUILD_TYPE} STREQUAL "Debug") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /analyze") + endif() else() set(WARNINGS "sign-compare") set(WARNINGS_DISABLED "") @@ -594,6 +598,9 @@ message(" Docbook Generator: ${DOCBOOK_GENERATOR_NAME} " message(" gcc coverage profiling: ${DBUS_GCOV_ENABLED} ") +if(MSVC) +message(" MSVC code analyze mode: ${DBUS_MSVC_CODEANALYZE} ") +endif() message(" Building unit tests: ${DBUS_BUILD_TESTS} ") message(" Building with GLib: ${DBUS_WITH_GLIB} ") message(" Building verbose mode: ${DBUS_ENABLE_VERBOSE_MODE} ") diff --git a/dbus/dbus-internals.h b/dbus/dbus-internals.h index 57a67d0..ae9ab62 100644 --- a/dbus/dbus-internals.h +++ b/dbus/dbus-internals.h @@ -366,7 +366,8 @@ typedef enum _DBUS_N_GLOBAL_LOCKS } DBusGlobalLock; -dbus_bool_t _dbus_lock (DBusGlobalLock lock) _DBUS_GNUC_WARN_UNUSED_RESULT; +_DBUS_WARN_UNUSED_RESULT +dbus_bool_t _dbus_lock (DBusGlobalLock lock); void _dbus_unlock (DBusGlobalLock lock); #define _DBUS_LOCK_NAME(name) _DBUS_LOCK_##name @@ -399,7 +400,7 @@ union DBusGUID char as_bytes[DBUS_UUID_LENGTH_BYTES]; /**< guid as 16 single-byte values */ }; -DBUS_PRIVATE_EXPORT _DBUS_GNUC_WARN_UNUSED_RESULT +DBUS_PRIVATE_EXPORT _DBUS_WARN_UNUSED_RESULT dbus_bool_t _dbus_generate_uuid (DBusGUID *uuid, DBusError *error); DBUS_PRIVATE_EXPORT diff --git a/dbus/dbus-macros.h b/dbus/dbus-macros.h index 2c8956e..47da36e 100644 --- a/dbus/dbus-macros.h +++ b/dbus/dbus-macros.h @@ -92,10 +92,29 @@ #define DBUS_ALLOC_SIZE2(x,y) #endif -#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -#define _DBUS_GNUC_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +/** MSVC requires to specify this warning in the declaration + * + * It is allowed to use this attribute as in the following examples: + * _DBUS_WARN_UNUSED_RESULT DBUS_PRIVATE_EXPORT returnvalue functionName(); + * DBUS_PRIVATE_EXPORT _DBUS_WARN_UNUSED_RESULT returnvalue functionName(); + * DBUS_PRIVATE_EXPORT returnvalue _DBUS_WARN_UNUSED_RESULT functionName(); + * + * _DBUS_WARN_UNUSED_RESULT static inline returnvalue functionName(); + * static _DBUS_WARN_UNUSED_RESULT inline returnvalue functionName(); + * static inline _DBUS_WARN_UNUSED_RESULT returnvalue functionName(); + * static inline returnvalue _DBUS_WARN_UNUSED_RESULT functionName(); + * + * does not work with MSVC, produces compiling errors: + * DBUS_PRIVATE_EXPORT returnvalue functionName _DBUS_WARN_UNUSED_RESULT (); + * DBUS_PRIVATE_EXPORT returnvalue functionName() _DBUS_WARN_UNUSED_RESULT; + * + */ +#if defined(_MSC_VER) && (_MSC_VER >= 1700) +#define _DBUS_WARN_UNUSED_RESULT _Must_inspect_result_ +#elif (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +#define _DBUS_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #else -#define _DBUS_GNUC_WARN_UNUSED_RESULT +#define _DBUS_WARN_UNUSED_RESULT #endif /** @def _DBUS_GNUC_PRINTF @@ -104,8 +123,8 @@ /** @def _DBUS_GNUC_NORETURN * used to tell gcc about functions that never return, such as _dbus_abort() */ -/** @def _DBUS_GNUC_WARN_UNUSED_RESULT - * used to tell gcc about functions whose result must be used +/** @def _DBUS_WARN_UNUSED_RESULT + * used to tell gcc and msvc about functions whose result must be used */ /* Normally docs are in .c files, but there isn't a .c file for this. */ diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h index b3c73b6..093f448 100644 --- a/dbus/dbus-sysdeps.h +++ b/dbus/dbus-sysdeps.h @@ -135,6 +135,7 @@ typedef struct { SOCKET sock; } DBusSocket; static inline SOCKET _dbus_socket_printable (DBusSocket s) { return s.sock; } +_DBUS_WARN_UNUSED_RESULT static inline dbus_bool_t _dbus_socket_is_valid (DBusSocket s) { return s.sock != INVALID_SOCKET; } @@ -153,6 +154,7 @@ typedef struct { int fd; } DBusSocket; static inline int _dbus_socket_printable (DBusSocket s) { return s.fd; } +_DBUS_WARN_UNUSED_RESULT static inline dbus_bool_t _dbus_socket_is_valid (DBusSocket s) { return s.fd >= 0; } @@ -462,7 +464,7 @@ const char* _dbus_get_tmpdir (void); /** * Random numbers */ -_DBUS_GNUC_WARN_UNUSED_RESULT +_DBUS_WARN_UNUSED_RESULT dbus_bool_t _dbus_generate_random_bytes_buffer (char *buffer, int n_bytes, DBusError *error); diff --git a/dbus/dbus-userdb.h b/dbus/dbus-userdb.h index 53fc90b..4ed614f 100644 --- a/dbus/dbus-userdb.h +++ b/dbus/dbus-userdb.h @@ -94,7 +94,7 @@ void _dbus_group_info_free_allocated (DBusGroupInfo *info); DBUS_PRIVATE_EXPORT DBusUserDatabase* _dbus_user_database_get_system (void); DBUS_PRIVATE_EXPORT -dbus_bool_t _dbus_user_database_lock_system (void) _DBUS_GNUC_WARN_UNUSED_RESULT; +dbus_bool_t _dbus_user_database_lock_system (void) _DBUS_WARN_UNUSED_RESULT; DBUS_PRIVATE_EXPORT void _dbus_user_database_unlock_system (void); void _dbus_user_database_flush_system (void); diff --git a/test/test-utils.h b/test/test-utils.h index 860ee21..14ea365 100644 --- a/test/test-utils.h +++ b/test/test-utils.h @@ -10,16 +10,16 @@ #include typedef DBusLoop TestMainContext; -_DBUS_GNUC_WARN_UNUSED_RESULT +_DBUS_WARN_UNUSED_RESULT TestMainContext *test_main_context_get (void); -_DBUS_GNUC_WARN_UNUSED_RESULT +_DBUS_WARN_UNUSED_RESULT TestMainContext *test_main_context_try_get (void); TestMainContext *test_main_context_ref (TestMainContext *ctx); void test_main_context_unref (TestMainContext *ctx); void test_main_context_iterate (TestMainContext *ctx, dbus_bool_t may_block); -_DBUS_GNUC_WARN_UNUSED_RESULT +_DBUS_WARN_UNUSED_RESULT dbus_bool_t test_connection_try_setup (TestMainContext *ctx, DBusConnection *connection); void test_connection_setup (TestMainContext *ctx, @@ -27,7 +27,7 @@ void test_connection_setup (TestMainContext *ctx, void test_connection_shutdown (TestMainContext *ctx, DBusConnection *connection); -_DBUS_GNUC_WARN_UNUSED_RESULT +_DBUS_WARN_UNUSED_RESULT dbus_bool_t test_server_try_setup (TestMainContext *ctx, DBusServer *server); void test_server_setup (TestMainContext *ctx, -- 2.7.0.windows.1