From ce60d0b009cbbfca4eb8ec9b3d889ec5eb8198c1 Mon Sep 17 00:00:00 2001 From: Deniz Evrenci Date: Tue, 26 Mar 2019 20:56:12 +0900 Subject: [PATCH 1/3] [C] Suppress maybe-uninitialized warnings in GCC. GCC is known to emit false positives when it cannot detect if a variable is initialized. --- .../sbe/generation/c/CGenerator.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/c/CGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/c/CGenerator.java index 0e59112086..2c65adbb7a 100755 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/c/CGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/c/CGenerator.java @@ -337,7 +337,14 @@ private static void generateGroupHeaderFunctions( "SBE_ONE_DEF uint64_t %3$s_sbe_position(const struct %3$s *const codec)\n" + "{\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic push\n" + + "#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n" + + "#endif\n" + " return *codec->position_ptr;\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic pop\n" + + "#endif\n" + "}\n\n" + "SBE_ONE_DEF bool %3$s_set_sbe_position(struct %3$s *const codec, const uint64_t position)\n" + @@ -358,14 +365,28 @@ private static void generateGroupHeaderFunctions( "SBE_ONE_DEF bool %3$s_has_next(const struct %3$s *const codec)\n" + "{\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic push\n" + + "#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n" + + "#endif\n" + " return codec->index + 1 < codec->count;\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic pop\n" + + "#endif\n" + "}\n\n" + "SBE_ONE_DEF struct %3$s *%3$s_next(struct %3$s *const codec)\n" + "{\n" + " codec->offset = *codec->position_ptr;\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic push\n" + + "#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n" + + "#endif\n" + " if (SBE_BOUNDS_CHECK_EXPECT(((codec->offset + codec->block_length) " + "> codec->buffer_length), false))\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic pop\n" + + "#endif\n" + " {\n" + " errno = E108;\n" + " return NULL;\n" + @@ -1341,7 +1362,14 @@ private CharSequence generateLoadValue( { sb.append(String.format( " %1$s val;\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic push\n" + + "#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n" + + "#endif\n" + " memcpy(&val, codec->buffer + codec->offset + %2$s, sizeof(%1$s));\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic pop\n" + + "#endif\n" + " %4$s %3$s(val);", cTypeName, offsetStr, @@ -1400,7 +1428,14 @@ private CharSequence generateStoreValue( { sb.append(String.format( " %1$s val = %2$s(value);\n" + - " memcpy(codec->buffer + codec->offset + %3$s, &val, sizeof(%1$s));", + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic push\n" + + "#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n" + + "#endif\n" + + " memcpy(codec->buffer + codec->offset + %3$s, &val, sizeof(%1$s));\n" + + "#if defined(__GNUG__) && !defined(__clang__)\n" + + "#pragma GCC diagnostic pop\n" + + "#endif", cTypeName, byteOrderStr, offsetStr)); From fe75ad1dd5d4c4fa80d8081cc9e4b5b67bafeb1b Mon Sep 17 00:00:00 2001 From: Deniz Evrenci Date: Tue, 26 Mar 2019 20:58:27 +0900 Subject: [PATCH 2/3] [C/C++] Turn on warnings as errors in tests for AppleClang, Clang and GCC. --- sbe-tool/src/test/c/CMakeLists.txt | 3 +++ sbe-tool/src/test/cpp/CMakeLists.txt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/sbe-tool/src/test/c/CMakeLists.txt b/sbe-tool/src/test/c/CMakeLists.txt index 1134cd2f4f..d5d2a85b53 100644 --- a/sbe-tool/src/test/c/CMakeLists.txt +++ b/sbe-tool/src/test/c/CMakeLists.txt @@ -20,6 +20,9 @@ function(sbe_test name) PRIVATE ${GTEST_SOURCE_DIR}/googletest/include PRIVATE ${C_CODEC_TARGET_DIR} ) + target_compile_options("C${name}" PRIVATE $<$:-Werror>) + target_compile_options("C${name}" PRIVATE $<$:-Werror>) + target_compile_options("C${name}" PRIVATE $<$:-Werror>) target_link_libraries("C${name}" ${GTEST_LIBS} ${CMAKE_THREAD_LIBS_INIT}) add_test(NAME C${name} COMMAND C${name} WORKING_DIRECTORY ${C_CODEC_TARGET_DIR}) add_dependencies(C${name} gtest) diff --git a/sbe-tool/src/test/cpp/CMakeLists.txt b/sbe-tool/src/test/cpp/CMakeLists.txt index c946466424..c3531029e4 100644 --- a/sbe-tool/src/test/cpp/CMakeLists.txt +++ b/sbe-tool/src/test/cpp/CMakeLists.txt @@ -20,6 +20,9 @@ function(sbe_test name) PRIVATE ${GTEST_SOURCE_DIR}/googletest/include PRIVATE ${CXX_CODEC_TARGET_DIR} ) + target_compile_options("${name}" PRIVATE $<$:-Werror>) + target_compile_options("${name}" PRIVATE $<$:-Werror>) + target_compile_options("${name}" PRIVATE $<$:-Werror>) target_link_libraries("${name}" sbe ${GTEST_LIBS} ${CMAKE_THREAD_LIBS_INIT}) add_test(NAME ${name} COMMAND ${name} WORKING_DIRECTORY ${CXX_CODEC_TARGET_DIR}) add_dependencies(${name} gtest) From 77d8782848a233dabf43125bee8dda2d11f0bb37 Mon Sep 17 00:00:00 2001 From: Deniz Evrenci Date: Mon, 25 Mar 2019 21:04:23 +0900 Subject: [PATCH 3/3] [C++] Fix the indentation of generated code. --- .../sbe/generation/cpp/CppGenerator.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java index 953c45f25c..cefe9976b1 100755 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java @@ -387,7 +387,7 @@ private static CharSequence generateGroupProperty( sb.append(String.format("\n" + indent + " static SBE_CONSTEXPR std::uint64_t %1$sSinceVersion() SBE_NOEXCEPT\n" + indent + " {\n" + - indent + " return %2$d;\n" + + indent + " return %2$d;\n" + indent + " }\n\n" + indent + " bool %1$sInActingVersion() const SBE_NOEXCEPT\n" + @@ -437,11 +437,11 @@ private CharSequence generateVarData(final String className, final List t indent + " const char *%1$s()\n" + indent + " {\n" + "%2$s" + - indent + " %4$s lengthFieldValue;\n" + - indent + " std::memcpy(&lengthFieldValue, m_buffer + sbePosition(), sizeof(%4$s));\n" + - indent + " const char *fieldPtr = m_buffer + sbePosition() + %3$d;\n" + - indent + " sbePosition(sbePosition() + %3$d + %5$s(lengthFieldValue));\n" + - indent + " return fieldPtr;\n" + + indent + " %4$s lengthFieldValue;\n" + + indent + " std::memcpy(&lengthFieldValue, m_buffer + sbePosition(), sizeof(%4$s));\n" + + indent + " const char *fieldPtr = m_buffer + sbePosition() + %3$d;\n" + + indent + " sbePosition(sbePosition() + %3$d + %5$s(lengthFieldValue));\n" + + indent + " return fieldPtr;\n" + indent + " }\n", formatPropertyName(propertyName), generateTypeFieldNotPresentCondition(token.version(), indent), @@ -539,7 +539,7 @@ private CharSequence generateVarData(final String className, final List t indent + " {\n" + indent + " if (str.length() > %6$d)\n" + indent + " {\n" + - indent + " throw std::runtime_error(\"std::string too long for length type [E109]\");\n" + + indent + " throw std::runtime_error(\"std::string too long for length type [E109]\");\n" + indent + " }\n" + indent + " std::uint64_t lengthOfLengthField = %3$d;\n" + indent + " std::uint64_t lengthPosition = sbePosition();\n" + @@ -585,7 +585,7 @@ private void generateVarDataDescriptors( sb.append(String.format("\n" + indent + " static SBE_CONSTEXPR std::uint64_t %1$sSinceVersion() SBE_NOEXCEPT\n" + indent + " {\n" + - indent + " return %2$d;\n" + + indent + " return %2$d;\n" + indent + " }\n\n" + indent + " bool %1$sInActingVersion() SBE_NOEXCEPT\n" + @@ -1365,7 +1365,7 @@ private CharSequence generateArrayProperty( indent + " {\n" + indent + " if (length > %2$d)\n" + indent + " {\n" + - indent + " throw std::runtime_error(\"length too large for get%1$s [E106]\");\n" + + indent + " throw std::runtime_error(\"length too large for get%1$s [E106]\");\n" + indent + " }\n\n" + "%3$s" + @@ -1431,7 +1431,7 @@ private CharSequence generateArrayProperty( indent + " const size_t srcLength = str.length();\n" + indent + " if (srcLength > %4$d)\n" + indent + " {\n" + - indent + " throw std::runtime_error(\"string too large for put%2$s [E106]\");\n" + + indent + " throw std::runtime_error(\"string too large for put%2$s [E106]\");\n" + indent + " }\n\n" + indent + " size_t length = srcLength < %4$d ? srcLength : %4$d;\n" + @@ -1449,7 +1449,7 @@ private CharSequence generateArrayProperty( indent + " const size_t srcLength = str.length();\n" + indent + " if (srcLength > %4$d)\n" + indent + " {\n" + - indent + " throw std::runtime_error(\"string too large for put%2$s [E106]\");\n" + + indent + " throw std::runtime_error(\"string too large for put%2$s [E106]\");\n" + indent + " }\n\n" + indent + " size_t length = srcLength < %4$d ? srcLength : %4$d;\n" + @@ -1791,8 +1791,8 @@ private CharSequence generateMessageFlyweightCode(final String className, final " }\n\n" + " %10$s &wrapForDecode(\n" + - " char *buffer, const std::uint64_t offset, const std::uint64_t actingBlockLength,\n" + - " const std::uint64_t actingVersion, const std::uint64_t bufferLength)\n" + + " char *buffer, const std::uint64_t offset, const std::uint64_t actingBlockLength,\n" + + " const std::uint64_t actingVersion, const std::uint64_t bufferLength)\n" + " {\n" + " return *this = %10$s(buffer, offset, bufferLength, actingBlockLength, actingVersion);\n" + " }\n\n" + @@ -1916,7 +1916,7 @@ private void generateFieldCommonMethods( sb.append(String.format("\n" + indent + " static SBE_CONSTEXPR std::uint64_t %1$sSinceVersion() SBE_NOEXCEPT\n" + indent + " {\n" + - indent + " return %2$d;\n" + + indent + " return %2$d;\n" + indent + " }\n\n" + indent + " bool %1$sInActingVersion() SBE_NOEXCEPT\n" + @@ -1936,7 +1936,7 @@ private void generateFieldCommonMethods( sb.append(String.format("\n" + indent + " static SBE_CONSTEXPR std::size_t %1$sEncodingOffset() SBE_NOEXCEPT\n" + indent + " {\n" + - indent + " return %2$d;\n" + + indent + " return %2$d;\n" + indent + " }\n", propertyName, encodingToken.offset()));