Repository: thrift Updated Branches: refs/heads/master e0ccbd6e6 -> 7edc8faef
THRIFT-3873: fix various compiler warnings and overflow errors THRIFT-3847: change VERSION to PACKAGE_VERSION to avoid conflicts with third party or OS headers This closes #1128 Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/7edc8fae Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/7edc8fae Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/7edc8fae Branch: refs/heads/master Commit: 7edc8faefd391ce11eca3023a35cc54bcb2eb1af Parents: e0ccbd6 Author: James E. King, III <jk...@apache.org> Authored: Fri Jan 20 10:11:41 2017 -0500 Committer: James E. King, III <jk...@apache.org> Committed: Fri Jan 20 10:12:06 2017 -0500 ---------------------------------------------------------------------- build/cmake/ConfigureChecks.cmake | 19 ++++---- build/cmake/DefinePlatformSpecifc.cmake | 12 +++++ build/cmake/FindInttypes.cmake | 41 +++++++++++++++++ build/cmake/FindLibevent.cmake | 10 +++-- build/cmake/config.h.in | 5 +-- compiler/cpp/CMakeLists.txt | 8 ++++ .../cpp/src/thrift/generate/t_erl_generator.cc | 15 +++++-- .../cpp/src/thrift/generate/t_go_generator.cc | 11 +++-- compiler/cpp/src/thrift/thriftl.ll | 16 +++++-- compiler/cpp/src/thrift/thrifty.yy | 4 ++ compiler/cpp/src/thrift/windows/config.h | 8 +++- lib/cpp/src/thrift/protocol/THeaderProtocol.h | 4 +- lib/cpp/src/thrift/protocol/TJSONProtocol.cpp | 2 +- .../src/thrift/server/TNonblockingServer.cpp | 11 ++--- .../src/thrift/transport/THeaderTransport.cpp | 36 +++++++++------ lib/cpp/src/thrift/transport/THeaderTransport.h | 12 +++-- lib/cpp/src/thrift/transport/THttpClient.cpp | 3 +- lib/cpp/src/thrift/transport/THttpServer.cpp | 3 +- lib/cpp/src/thrift/transport/TServerSocket.cpp | 4 -- lib/cpp/src/thrift/transport/TSocket.cpp | 4 -- .../src/thrift/transport/TTransportException.h | 16 +++++++ lib/cpp/src/thrift/windows/config.h | 4 +- lib/cpp/test/AllProtocolTests.tcc | 8 ++-- lib/cpp/test/CMakeLists.txt | 9 +++- lib/cpp/test/JSONProtoTest.cpp | 3 +- lib/cpp/test/ZlibTest.cpp | 10 ++++- lib/cpp/test/processor/ServerThread.cpp | 2 + lib/cpp/test/processor/ServerThread.h | 3 +- test/cpp/CMakeLists.txt | 1 - test/cpp/Makefile.am | 2 +- test/cpp/src/TestClient.cpp | 46 ++++++++++++-------- test/cpp/src/TestServer.cpp | 10 +++-- tutorial/cpp/CMakeLists.txt | 8 +++- 33 files changed, 248 insertions(+), 102 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/build/cmake/ConfigureChecks.cmake ---------------------------------------------------------------------- diff --git a/build/cmake/ConfigureChecks.cmake b/build/cmake/ConfigureChecks.cmake index f650544..81223d8 100644 --- a/build/cmake/ConfigureChecks.cmake +++ b/build/cmake/ConfigureChecks.cmake @@ -17,17 +17,16 @@ # under the License. # - -include(CheckSymbolExists) +include(CheckFunctionExists) include(CheckIncludeFile) include(CheckIncludeFiles) -include(CheckFunctionExists) +include(CheckSymbolExists) -# If AI_ADDRCONFIG is not defined we define it as 0 -check_symbol_exists(AI_ADDRCONFIG "sys/types.h;sys/socket.h;netdb.h" HAVE_AI_ADDRCONFIG) -if(NOT HAVE_AI_ADDRCONFIG) -set(AI_ADDRCONFIG 1) -endif(NOT HAVE_AI_ADDRCONFIG) +if (Inttypes_FOUND) + # This allows the inttypes.h and stdint.h checks to succeed on platforms that + # do not natively provide there. + set (CMAKE_REQUIRED_INCLUDES ${INTTYPES_INCLUDE_DIRS}) +endif () check_include_file(arpa/inet.h HAVE_ARPA_INET_H) check_include_file(fcntl.h HAVE_FCNTL_H) @@ -72,5 +71,5 @@ set(VERSION ${thrift_VERSION}) # generate a config.h file configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/thrift/config.h") -# HACK: Some files include thrift/config.h and some config.h so we include both. This should be cleaned up. -include_directories("${CMAKE_CURRENT_BINARY_DIR}/thrift" "${CMAKE_CURRENT_BINARY_DIR}") + +include_directories("${CMAKE_CURRENT_BINARY_DIR}") http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/build/cmake/DefinePlatformSpecifc.cmake ---------------------------------------------------------------------- diff --git a/build/cmake/DefinePlatformSpecifc.cmake b/build/cmake/DefinePlatformSpecifc.cmake index e57ecc2..496134c 100644 --- a/build/cmake/DefinePlatformSpecifc.cmake +++ b/build/cmake/DefinePlatformSpecifc.cmake @@ -71,12 +71,24 @@ if(MSVC) message (FATAL_ERROR "Windows build does not support shared library output yet, please set -DWITH_SHARED_LIB=off") endif() + add_definitions("/MP") # parallel build + add_definitions("/W3") # warning level 3 + + # VS2010 does not provide inttypes which we need for "PRId64" used in many places + find_package(Inttypes) + if (Inttypes_FOUND) + include_directories(${INTTYPES_INCLUDE_DIRS}) + # OpenSSL conflicts with the definition of PRId64 unless it is defined first + add_definitions("/FIinttypes.h") + endif () elseif(UNIX) find_program( MEMORYCHECK_COMMAND valgrind ) set( MEMORYCHECK_COMMAND_OPTIONS "--gen-suppressions=all --leak-check=full" ) set( MEMORYCHECK_SUPPRESSIONS_FILE "${PROJECT_SOURCE_DIR}/test/valgrind.suppress" ) endif() +add_definitions("-D__STDC_FORMAT_MACROS") + # WITH_*THREADS selects which threading library to use if(WITH_BOOSTTHREADS) add_definitions("-DUSE_BOOST_THREAD=1") http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/build/cmake/FindInttypes.cmake ---------------------------------------------------------------------- diff --git a/build/cmake/FindInttypes.cmake b/build/cmake/FindInttypes.cmake new file mode 100644 index 0000000..e661f78 --- /dev/null +++ b/build/cmake/FindInttypes.cmake @@ -0,0 +1,41 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# find msinttypes on compilers that don't provide it, for example +# VS2010 + +# Usage: +# Provide INTTYPES_ROOT if you need it +# Result: INTTYPES_INCLUDE_DIRS, where to find inttypes.h +# Result: Inttypes_FOUND, If false, inttypes.h was not found + +find_path(INTTYPES_INCLUDE_DIRS inttypes.h HINTS ${INTTYPES_ROOT}) +if (INTTYPES_INCLUDE_DIRS) + set(Inttypes_FOUND TRUE) +else () + set(Inttypes_FOUND FALSE) + if (Inttypes_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find inttypes.h") + endif () + message(STATUS "inttypes.h NOT found") +endif () + +mark_as_advanced( + INTTYPES_INCLUDE_DIRS +) http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/build/cmake/FindLibevent.cmake ---------------------------------------------------------------------- diff --git a/build/cmake/FindLibevent.cmake b/build/cmake/FindLibevent.cmake index 2bcd709..ac6a078 100644 --- a/build/cmake/FindLibevent.cmake +++ b/build/cmake/FindLibevent.cmake @@ -13,9 +13,13 @@ foreach(prefix ${LibEvent_EXTRA_PREFIXES}) list(APPEND LibEvent_LIBRARIES_PATHS "${prefix}/lib") endforeach() -find_path(LIBEVENT_INCLUDE_DIRS event.h PATHS ${LibEvent_INCLUDE_PATHS}) -# "lib" prefix is needed on Windows -find_library(LIBEVENT_LIBRARIES NAMES event libevent PATHS ${LibEvent_LIBRARIES_PATHS}) +# Looking for "event.h" will find the Platform SDK include dir on windows +# so we also look for a peer header like evhttp.h to get the right path +find_path(LIBEVENT_INCLUDE_DIRS evhttp.h event.h PATHS ${LibEvent_INCLUDE_PATHS}) + +# "lib" prefix is needed on Windows in some cases +# newer versions of libevent use three libraries +find_library(LIBEVENT_LIBRARIES NAMES event event_core event_extra libevent PATHS ${LibEvent_LIBRARIES_PATHS}) if (LIBEVENT_LIBRARIES AND LIBEVENT_INCLUDE_DIRS) set(Libevent_FOUND TRUE) http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/build/cmake/config.h.in ---------------------------------------------------------------------- diff --git a/build/cmake/config.h.in b/build/cmake/config.h.in index 181ea18..083bc55 100644 --- a/build/cmake/config.h.in +++ b/build/cmake/config.h.in @@ -44,9 +44,6 @@ /* Define to the full name and version of this package. */ #define PACKAGE_STRING "${PACKAGE_STRING}" -/* Version number of package */ -#define VERSION "${VERSION}" - /************************** DEFINES *************************/ /* Define if the AI_ADDRCONFIG symbol is unavailable */ @@ -154,4 +151,4 @@ /* Define to 1 if strerror_r returns char *. */ #cmakedefine STRERROR_R_CHAR_P 1 -#endif \ No newline at end of file +#endif http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/compiler/cpp/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/compiler/cpp/CMakeLists.txt b/compiler/cpp/CMakeLists.txt index 85e351d..059c3bf 100644 --- a/compiler/cpp/CMakeLists.txt +++ b/compiler/cpp/CMakeLists.txt @@ -18,6 +18,14 @@ # configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/thrift/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/thrift/version.h) +if(MSVC) + # The winflexbison generator outputs some macros that conflict with the Visual Studio 2010 copy of stdint.h + # This might be fixed in later versions of Visual Studio, but an easy solution is to include stdint.h first + if(HAVE_STDINT_H) + add_definitions(-D__STDC_LIMIT_MACROS) + add_definitions(/FI"stdint.h") + endif(HAVE_STDINT_H) +endif() find_package(FLEX REQUIRED) find_package(BISON REQUIRED) http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/compiler/cpp/src/thrift/generate/t_erl_generator.cc ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc index 4869414..6054a4e 100644 --- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc @@ -20,6 +20,7 @@ #include <string> #include <fstream> #include <iostream> +#include <limits> #include <vector> #include <stdlib.h> @@ -968,10 +969,13 @@ void t_erl_generator::export_string(string name, int num) { } void t_erl_generator::export_types_function(t_function* tfunction, string prefix) { - + t_struct::members_type::size_type num = tfunction->get_arglist()->get_members().size(); + if (num > static_cast<t_struct::members_type::size_type>(std::numeric_limits<int>().max())) { + throw "integer overflow in t_erl_generator::export_types_function, name " + tfunction->get_name(); + } export_types_string(prefix + tfunction->get_name(), 1 // This - + ((tfunction->get_arglist())->get_members()).size()); + + static_cast<int>(num)); } void t_erl_generator::export_types_string(string name, int num) { @@ -984,10 +988,13 @@ void t_erl_generator::export_types_string(string name, int num) { } void t_erl_generator::export_function(t_function* tfunction, string prefix) { - + t_struct::members_type::size_type num = tfunction->get_arglist()->get_members().size(); + if (num > static_cast<t_struct::members_type::size_type>(std::numeric_limits<int>().max())) { + throw "integer overflow in t_erl_generator::export_function, name " + tfunction->get_name(); + } export_string(prefix + tfunction->get_name(), 1 // This - + ((tfunction->get_arglist())->get_members()).size()); + + static_cast<int>(num)); } /** http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/compiler/cpp/src/thrift/generate/t_go_generator.cc ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index defc682..bb5a609 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -25,9 +25,10 @@ * guide for ensuring uniformity and readability. */ -#include <string> #include <fstream> #include <iostream> +#include <limits> +#include <string> #include <vector> #include <stdlib.h> @@ -433,7 +434,11 @@ std::string t_go_generator::camelcase(const std::string& value) const { if (islower(value2[i + 1])) { value2.replace(i, 2, 1, toupper(value2[i + 1])); } - fix_common_initialism(value2, i); + + if (i > static_cast<std::string::size_type>(std::numeric_limits<int>().max())) { + throw "integer overflow in t_go_generator::camelcase, value = " + value; + } + fix_common_initialism(value2, static_cast<int>(i)); } } @@ -2308,7 +2313,7 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "}" << endl; for (std::vector<t_field*>::size_type i = 0; i < num_args; ++i) { - int flagArg = i + 1; + std::vector<t_field*>::size_type flagArg = i + 1; t_type* the_type(args[i]->get_type()); t_type* the_type2(get_true_type(the_type)); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/compiler/cpp/src/thrift/thriftl.ll ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/thriftl.ll b/compiler/cpp/src/thrift/thriftl.ll index bf7e8a5..30669a4 100644 --- a/compiler/cpp/src/thrift/thriftl.ll +++ b/compiler/cpp/src/thrift/thriftl.ll @@ -39,9 +39,15 @@ #endif #ifdef _MSC_VER -//warning C4102: 'find_rule' : unreferenced label -#pragma warning(disable:4102) -//avoid isatty redefinition +#pragma warning( push ) + +// warning C4102: 'find_rule' : unreferenced label +#pragma warning( disable : 4102 ) + +// warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data +#pragma warning( disable : 4267 ) + +// avoid isatty redefinition #define YY_NEVER_INTERACTIVE 1 #define YY_NO_UNISTD_H 1 @@ -459,5 +465,9 @@ literal_begin (['\"]) %% +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + /* vim: filetype=lex */ http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/compiler/cpp/src/thrift/thrifty.yy ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/thrifty.yy b/compiler/cpp/src/thrift/thrifty.yy index b7a7f72..fcbc877 100644 --- a/compiler/cpp/src/thrift/thrifty.yy +++ b/compiler/cpp/src/thrift/thrifty.yy @@ -25,8 +25,12 @@ * */ +#ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS +#endif #include <stdio.h> #ifndef _MSC_VER #include <inttypes.h> http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/compiler/cpp/src/thrift/windows/config.h ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/windows/config.h b/compiler/cpp/src/thrift/windows/config.h index 5f057ca..d2269cf 100644 --- a/compiler/cpp/src/thrift/windows/config.h +++ b/compiler/cpp/src/thrift/windows/config.h @@ -34,9 +34,13 @@ #define strtoll(begin_ptr, end_ptr, length) _strtoi64(begin_ptr, end_ptr, length) -#define PRIu64 "I64d" -#define PRIi64 "I64d" +#ifndef PRIu64 +#define PRIu64 "I64u" +#endif +#ifndef PRIi64 +#define PRIi64 "I64i" +#endif // squelch deprecation warnings #pragma warning(disable : 4996) // squelch bool conversion performance warning http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/protocol/THeaderProtocol.h ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/protocol/THeaderProtocol.h b/lib/cpp/src/thrift/protocol/THeaderProtocol.h index e7d4bd6..b01bfb6 100644 --- a/lib/cpp/src/thrift/protocol/THeaderProtocol.h +++ b/lib/cpp/src/thrift/protocol/THeaderProtocol.h @@ -46,7 +46,7 @@ public: explicit THeaderProtocol(const boost::shared_ptr<TTransport>& trans, uint16_t protoId = T_COMPACT_PROTOCOL) : TVirtualProtocol<THeaderProtocol>(boost::shared_ptr<TTransport>(new THeaderTransport(trans))), - trans_(boost::dynamic_pointer_cast<THeaderTransport>(this->getTransport())), + trans_(boost::dynamic_pointer_cast<THeaderTransport>(getTransport())), protoId_(protoId) { trans_->setProtocolId(protoId); resetProtocol(); @@ -57,7 +57,7 @@ public: uint16_t protoId = T_COMPACT_PROTOCOL) : TVirtualProtocol<THeaderProtocol>( boost::shared_ptr<TTransport>(new THeaderTransport(inTrans, outTrans))), - trans_(boost::dynamic_pointer_cast<THeaderTransport>(this->getTransport())), + trans_(boost::dynamic_pointer_cast<THeaderTransport>(getTransport())), protoId_(protoId) { trans_->setProtocolId(protoId); resetProtocol(); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp index d3ec722..431e7c4 100644 --- a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp +++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp @@ -524,7 +524,7 @@ namespace { std::string doubleToString(double d) { std::ostringstream str; str.imbue(std::locale::classic()); - const int max_digits10 = 2 + std::numeric_limits<double>::digits10; + const std::streamsize max_digits10 = 2 + std::numeric_limits<double>::digits10; str.precision(max_digits10); str << d; return str.str(); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/server/TNonblockingServer.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/server/TNonblockingServer.cpp b/lib/cpp/src/thrift/server/TNonblockingServer.cpp index ccc37a2..537770b 100644 --- a/lib/cpp/src/thrift/server/TNonblockingServer.cpp +++ b/lib/cpp/src/thrift/server/TNonblockingServer.cpp @@ -17,8 +17,6 @@ * under the License. */ -#define __STDC_FORMAT_MACROS - #include <thrift/thrift-config.h> #include <thrift/server/TNonblockingServer.h> @@ -64,13 +62,12 @@ #define AF_LOCAL AF_UNIX #endif -#if !defined(PRIu32) -#define PRIu32 "I32u" -#define PRIu64 "I64u" +#ifdef HAVE_INTTYPES_H +#include <inttypes.h> #endif -#if defined(_WIN32) && (_WIN32_WINNT < 0x0600) - #define AI_ADDRCONFIG 0x0400 +#ifdef HAVE_STDINT_H +#include <stdint.h> #endif namespace apache { http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/transport/THeaderTransport.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/THeaderTransport.cpp b/lib/cpp/src/thrift/transport/THeaderTransport.cpp index b1fe923..f222910 100644 --- a/lib/cpp/src/thrift/transport/THeaderTransport.cpp +++ b/lib/cpp/src/thrift/transport/THeaderTransport.cpp @@ -23,11 +23,11 @@ #include <thrift/protocol/TBinaryProtocol.h> #include <thrift/protocol/TCompactProtocol.h> +#include <limits> #include <utility> -#include <cassert> #include <string> -#include <zlib.h> #include <string.h> +#include <zlib.h> using std::map; using boost::shared_ptr; @@ -172,7 +172,7 @@ bool THeaderTransport::readFrame() { * Reads a string from ptr, taking care not to reach headerBoundary * Advances ptr on success * - * @param str output string + * @param str output string * @throws CORRUPTED_DATA if size of string exceeds boundary */ void THeaderTransport::readString(uint8_t*& ptr, @@ -198,7 +198,10 @@ void THeaderTransport::readHeaderFormat(uint16_t headerSize, uint32_t sz) { uint8_t* ptr = reinterpret_cast<uint8_t*>(rBuf_.get() + 10); // Catch integer overflow, check for reasonable header size - assert(headerSize < 16384); + if (headerSize >= 16384) { + throw TTransportException(TTransportException::CORRUPTED_DATA, + "Header size is unreasonable"); + } headerSize *= 4; const uint8_t* const headerBoundary = ptr + headerSize; if (headerSize > sz) { @@ -252,7 +255,7 @@ void THeaderTransport::readHeaderFormat(uint16_t headerSize, uint32_t sz) { } // Untransform the data section. rBuf will contain result. - untransform(data, sz - (data - rBuf_.get())); // ignore header in size calc + untransform(data, safe_numeric_cast<uint32_t>(static_cast<ptrdiff_t>(sz) - (data - rBuf_.get()))); } void THeaderTransport::untransform(uint8_t* ptr, uint32_t sz) { @@ -375,7 +378,7 @@ void THeaderTransport::resetProtocol() { } uint32_t THeaderTransport::getWriteBytes() { - return wBase_ - wBuf_.get(); + return safe_numeric_cast<uint32_t>(wBase_ - wBuf_.get()); } /** @@ -384,7 +387,7 @@ uint32_t THeaderTransport::getWriteBytes() { * Automatically advances ptr to after the written portion */ void THeaderTransport::writeString(uint8_t*& ptr, const string& str) { - uint32_t strLen = str.length(); + int32_t strLen = safe_numeric_cast<int32_t>(str.length()); ptr += writeVarint32(strLen, ptr); memcpy(ptr, str.c_str(), strLen); // no need to write \0 ptr += strLen; @@ -394,7 +397,7 @@ void THeaderTransport::setHeader(const string& key, const string& value) { writeHeaders_[key] = value; } -size_t THeaderTransport::getMaxWriteHeadersSize() const { +uint32_t THeaderTransport::getMaxWriteHeadersSize() const { size_t maxWriteHeadersSize = 0; THeaderTransport::StringToStringMap::const_iterator it; for (it = writeHeaders_.begin(); it != writeHeaders_.end(); ++it) { @@ -402,7 +405,7 @@ size_t THeaderTransport::getMaxWriteHeadersSize() const { // 2 varints32 + the strings themselves maxWriteHeadersSize += 5 + 5 + (it->first).length() + (it->second).length(); } - return maxWriteHeadersSize; + return safe_numeric_cast<uint32_t>(maxWriteHeadersSize); } void THeaderTransport::clearHeaders() { @@ -431,7 +434,7 @@ void THeaderTransport::flush() { if (clientType == THRIFT_HEADER_CLIENT_TYPE) { // header size will need to be updated at the end because of varints. // Make it big enough here for max varint size, plus 4 for padding. - int headerSize = (2 + getNumTransforms()) * THRIFT_MAX_VARINT32_BYTES + 4; + uint32_t headerSize = (2 + getNumTransforms()) * THRIFT_MAX_VARINT32_BYTES + 4; // add approximate size of info headers headerSize += getMaxWriteHeadersSize(); @@ -479,11 +482,11 @@ void THeaderTransport::flush() { // write info headers // for now only write kv-headers - uint16_t headerCount = writeHeaders_.size(); + int32_t headerCount = safe_numeric_cast<int32_t>(writeHeaders_.size()); if (headerCount > 0) { pkt += writeVarint32(infoIdType::KEYVALUE, pkt); // Write key-value headers count - pkt += writeVarint32(headerCount, pkt); + pkt += writeVarint32(static_cast<int32_t>(headerCount), pkt); // Write info headers map<string, string>::const_iterator it; for (it = writeHeaders_.begin(); it != writeHeaders_.end(); ++it) { @@ -494,7 +497,7 @@ void THeaderTransport::flush() { } // Fixups after varint size calculations - headerSize = (pkt - headerStart); + headerSize = safe_numeric_cast<uint32_t>(pkt - headerStart); uint8_t padding = 4 - (headerSize % 4); headerSize += padding; @@ -504,8 +507,13 @@ void THeaderTransport::flush() { } // Pkt size + ptrdiff_t szHbp = (headerStart - pktStart - 4); + if (static_cast<uint64_t>(szHbp) > static_cast<uint64_t>(std::numeric_limits<uint32_t>().max()) - (headerSize + haveBytes)) { + throw TTransportException(TTransportException::CORRUPTED_DATA, + "Header section size is unreasonable"); + } szHbo = headerSize + haveBytes // thrift header + payload - + (headerStart - pktStart - 4); // common header section + + static_cast<uint32_t>(szHbp); // common header section headerSizeN = htons(headerSize / 4); memcpy(headerSizePtr, &headerSizeN, sizeof(headerSizeN)); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/transport/THeaderTransport.h ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/THeaderTransport.h b/lib/cpp/src/thrift/transport/THeaderTransport.h index bf82674..af20fe3 100644 --- a/lib/cpp/src/thrift/transport/THeaderTransport.h +++ b/lib/cpp/src/thrift/transport/THeaderTransport.h @@ -21,11 +21,18 @@ #define THRIFT_TRANSPORT_THEADERTRANSPORT_H_ 1 #include <bitset> +#include <limits> #include <vector> #include <stdexcept> #include <string> #include <map> +#ifdef HAVE_STDINT_H +#include <stdint.h> +#elif HAVE_INTTYPES_H +#include <inttypes.h> +#endif + #include <boost/scoped_array.hpp> #include <boost/shared_ptr.hpp> @@ -135,8 +142,7 @@ public: void transform(uint8_t* ptr, uint32_t sz); uint16_t getNumTransforms() const { - int trans = writeTrans_.size(); - return trans; + return safe_numeric_cast<uint16_t>(writeTrans_.size()); } void setTransform(uint16_t transId) { writeTrans_.push_back(transId); } @@ -204,7 +210,7 @@ protected: /** * Returns the maximum number of bytes that write k/v headers can take */ - size_t getMaxWriteHeadersSize() const; + uint32_t getMaxWriteHeadersSize() const; struct infoIdType { enum idType { http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/transport/THttpClient.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/THttpClient.cpp b/lib/cpp/src/thrift/transport/THttpClient.cpp index c610636..732c7e4 100644 --- a/lib/cpp/src/thrift/transport/THttpClient.cpp +++ b/lib/cpp/src/thrift/transport/THttpClient.cpp @@ -22,6 +22,7 @@ #include <sstream> #include <boost/algorithm/string.hpp> +#include <thrift/config.h> #include <thrift/transport/THttpClient.h> #include <thrift/transport/TSocket.h> @@ -102,7 +103,7 @@ void THttpClient::flush() { std::ostringstream h; h << "POST " << path_ << " HTTP/1.1" << CRLF << "Host: " << host_ << CRLF << "Content-Type: application/x-thrift" << CRLF << "Content-Length: " << len << CRLF - << "Accept: application/x-thrift" << CRLF << "User-Agent: Thrift/" << VERSION + << "Accept: application/x-thrift" << CRLF << "User-Agent: Thrift/" << PACKAGE_VERSION << " (C++/THttpClient)" << CRLF << CRLF; string header = h.str(); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/transport/THttpServer.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/THttpServer.cpp b/lib/cpp/src/thrift/transport/THttpServer.cpp index c89ab94..3bf3053 100644 --- a/lib/cpp/src/thrift/transport/THttpServer.cpp +++ b/lib/cpp/src/thrift/transport/THttpServer.cpp @@ -21,6 +21,7 @@ #include <sstream> #include <iostream> +#include <thrift/config.h> #include <thrift/transport/THttpServer.h> #include <thrift/transport/TSocket.h> #if defined(_MSC_VER) || defined(__MINGW32__) @@ -124,7 +125,7 @@ void THttpServer::flush() { // Construct the HTTP header std::ostringstream h; h << "HTTP/1.1 200 OK" << CRLF << "Date: " << getTimeRFC1123() << CRLF << "Server: Thrift/" - << VERSION << CRLF << "Access-Control-Allow-Origin: *" << CRLF + << PACKAGE_VERSION << CRLF << "Access-Control-Allow-Origin: *" << CRLF << "Content-Type: application/x-thrift" << CRLF << "Content-Length: " << len << CRLF << "Connection: Keep-Alive" << CRLF << CRLF; string header = h.str(); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/transport/TServerSocket.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index 87b6383..8b65319 100644 --- a/lib/cpp/src/thrift/transport/TServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp @@ -60,10 +60,6 @@ #endif // _WIN32 #endif -#if defined(_WIN32) && (_WIN32_WINNT < 0x0600) - #define AI_ADDRCONFIG 0x0400 -#endif - template <class T> inline const SOCKOPT_CAST_T* const_cast_sockopt(const T* v) { return reinterpret_cast<const SOCKOPT_CAST_T*>(v); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/transport/TSocket.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TSocket.cpp b/lib/cpp/src/thrift/transport/TSocket.cpp index e1c106a..9fad590 100644 --- a/lib/cpp/src/thrift/transport/TSocket.cpp +++ b/lib/cpp/src/thrift/transport/TSocket.cpp @@ -53,10 +53,6 @@ #endif // _WIN32 #endif -#if defined(_WIN32) && (_WIN32_WINNT < 0x0600) - #define AI_ADDRCONFIG 0x0400 -#endif - template <class T> inline const SOCKOPT_CAST_T* const_cast_sockopt(const T* v) { return reinterpret_cast<const SOCKOPT_CAST_T*>(v); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/transport/TTransportException.h ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TTransportException.h b/lib/cpp/src/thrift/transport/TTransportException.h index 83e876a..dbbb971 100644 --- a/lib/cpp/src/thrift/transport/TTransportException.h +++ b/lib/cpp/src/thrift/transport/TTransportException.h @@ -20,6 +20,7 @@ #ifndef _THRIFT_TRANSPORT_TTRANSPORTEXCEPTION_H_ #define _THRIFT_TRANSPORT_TTRANSPORTEXCEPTION_H_ 1 +#include <boost/numeric/conversion/cast.hpp> #include <string> #include <thrift/Thrift.h> @@ -83,6 +84,21 @@ protected: /** Error code */ TTransportExceptionType type_; }; + +/** + * Legacy code in transport implementations have overflow issues + * that need to be enforced. + */ +template <typename To, typename From> To safe_numeric_cast(From i) { + try { + return boost::numeric_cast<To>(i); + } + catch (const std::bad_cast& bc) { + throw TTransportException(TTransportException::CORRUPTED_DATA, + bc.what()); + } +} + } } } // apache::thrift::transport http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/src/thrift/windows/config.h ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/windows/config.h b/lib/cpp/src/thrift/windows/config.h index 674c260..cde9de6 100644 --- a/lib/cpp/src/thrift/windows/config.h +++ b/lib/cpp/src/thrift/windows/config.h @@ -36,6 +36,9 @@ #define USE_BOOST_THREAD 1 #endif +// Something that defines PRId64 is required to build +#define HAVE_INTTYPES_H 1 + // VS2010 or later has stdint.h #if _MSC_VER >= 1600 #define HAVE_STDINT_H 1 @@ -65,7 +68,6 @@ #pragma warning(disable : 4996) // Deprecated posix name. -#define VERSION "1.0.0-dev" #define HAVE_GETTIMEOFDAY 1 #define HAVE_SYS_STAT_H 1 http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/test/AllProtocolTests.tcc ---------------------------------------------------------------------- diff --git a/lib/cpp/test/AllProtocolTests.tcc b/lib/cpp/test/AllProtocolTests.tcc index 8c8eaa8..3e0b833 100644 --- a/lib/cpp/test/AllProtocolTests.tcc +++ b/lib/cpp/test/AllProtocolTests.tcc @@ -190,14 +190,14 @@ void testProtocol(const char* protoname) { testNaked<TProto, int64_t>(0); for (int64_t i = 0; i < 62; i++) { - testNaked<TProto, int64_t>(1L << i); - testNaked<TProto, int64_t>(-(1L << i)); + testNaked<TProto, int64_t>(1LL << i); + testNaked<TProto, int64_t>(-(1LL << i)); } testField<TProto, T_I64, int64_t>(0); for (int i = 0; i < 62; i++) { - testField<TProto, T_I64, int64_t>(1L << i); - testField<TProto, T_I64, int64_t>(-(1L << i)); + testField<TProto, T_I64, int64_t>(1LL << i); + testField<TProto, T_I64, int64_t>(-(1LL << i)); } testNaked<TProto, double>(123.456); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/test/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt index cbeff08..74b0a09 100644 --- a/lib/cpp/test/CMakeLists.txt +++ b/lib/cpp/test/CMakeLists.txt @@ -19,7 +19,13 @@ include_directories(SYSTEM "${Boost_INCLUDE_DIRS}") -#Make sure gen-cpp files can be included +add_definitions("-D__STDC_LIMIT_MACROS") + +if (WITH_DYN_LINK_TEST) + add_definitions( -DBOOST_TEST_DYN_LINK ) +endif() + +# Make sure gen-cpp files can be included include_directories("${CMAKE_CURRENT_BINARY_DIR}") # Create the thrift C++ test library @@ -54,7 +60,6 @@ set(testgencpp_cob_SOURCES ) add_library(testgencpp_cob STATIC ${testgencpp_cob_SOURCES}) - add_executable(Benchmark Benchmark.cpp) target_link_libraries(Benchmark testgencpp) LINK_AGAINST_THRIFT_LIBRARY(Benchmark thrift) http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/test/JSONProtoTest.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/test/JSONProtoTest.cpp b/lib/cpp/test/JSONProtoTest.cpp index 301a064..2da3044 100644 --- a/lib/cpp/test/JSONProtoTest.cpp +++ b/lib/cpp/test/JSONProtoTest.cpp @@ -262,8 +262,9 @@ BOOST_AUTO_TEST_CASE(test_json_proto_8) { ":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2,3]},\"14\":{\"lst\":[\"i64" "\",3,1,2,3]}}"; + const std::size_t bufSiz = strlen(json_string) * sizeof(char); boost::shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer( - (uint8_t*)(json_string), strlen(json_string)*sizeof(char))); + (uint8_t*)(json_string), static_cast<uint32_t>(bufSiz))); boost::shared_ptr<TJSONProtocol> proto(new TJSONProtocol(buffer)); OneOfEach ooe2; http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/test/ZlibTest.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/test/ZlibTest.cpp b/lib/cpp/test/ZlibTest.cpp index e155970..a4387a9 100644 --- a/lib/cpp/test/ZlibTest.cpp +++ b/lib/cpp/test/ZlibTest.cpp @@ -17,13 +17,19 @@ * under the License. */ -#define __STDC_FORMAT_MACROS - #ifndef _GNU_SOURCE #define _GNU_SOURCE // needed for getopt_long #endif +#if (_MSC_VER <= 1700) +// polynomial and std::fill_t warning happens in MSVC 2010, 2013, maybe others +// https://svn.boost.org/trac/boost/ticket/11426 +#pragma warning(disable:4996) +#endif + +#ifdef HAVE_STDINT_H #include <stdint.h> +#endif #ifdef HAVE_INTTYPES_H #include <inttypes.h> #endif http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/test/processor/ServerThread.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/test/processor/ServerThread.cpp b/lib/cpp/test/processor/ServerThread.cpp index e9d468f..009c4c6 100644 --- a/lib/cpp/test/processor/ServerThread.cpp +++ b/lib/cpp/test/processor/ServerThread.cpp @@ -35,6 +35,8 @@ void ServerThread::start() { assert(!running_); running_ = true; + helper_.reset(new Helper(this)); + // Start the other thread concurrency::PlatformThreadFactory threadFactory; threadFactory.setDetached(false); http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/lib/cpp/test/processor/ServerThread.h ---------------------------------------------------------------------- diff --git a/lib/cpp/test/processor/ServerThread.h b/lib/cpp/test/processor/ServerThread.h index eed3469..3803e7e 100644 --- a/lib/cpp/test/processor/ServerThread.h +++ b/lib/cpp/test/processor/ServerThread.h @@ -71,8 +71,7 @@ public: class ServerThread { public: ServerThread(const boost::shared_ptr<ServerState>& state, bool autoStart) - : helper_(new Helper(this)), - port_(0), + : port_(0), running_(false), serving_(false), error_(false), http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/test/cpp/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/test/cpp/CMakeLists.txt b/test/cpp/CMakeLists.txt index 09850a8..1facfa4 100755 --- a/test/cpp/CMakeLists.txt +++ b/test/cpp/CMakeLists.txt @@ -33,7 +33,6 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}") include_directories("${CMAKE_CURRENT_BINARY_DIR}/gen-cpp") include_directories("${PROJECT_SOURCE_DIR}/lib/cpp/src") - set(crosstestgencpp_SOURCES gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/test/cpp/Makefile.am ---------------------------------------------------------------------- diff --git a/test/cpp/Makefile.am b/test/cpp/Makefile.am index 9c4ac07..d825bdd 100755 --- a/test/cpp/Makefile.am +++ b/test/cpp/Makefile.am @@ -107,7 +107,7 @@ gen-cpp/StressTest_types.cpp gen-cpp/StressTest_constants.cpp gen-cpp/Service.cp $(THRIFT) --gen cpp $< AM_CPPFLAGS = $(BOOST_CPPFLAGS) $(LIBEVENT_CPPFLAGS) -I$(top_srcdir)/lib/cpp/src -Igen-cpp -AM_CXXFLAGS = -Wall -Wextra -pedantic +AM_CXXFLAGS = -Wall -Wextra -pedantic -D__STDC_LIMIT_MACROS AM_LDFLAGS = $(BOOST_LDFLAGS) $(LIBEVENT_LDFLAGS) $(ZLIB_LIBS) clean-local: http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/test/cpp/src/TestClient.cpp ---------------------------------------------------------------------- diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp index c16d045..da20b89 100644 --- a/test/cpp/src/TestClient.cpp +++ b/test/cpp/src/TestClient.cpp @@ -1,4 +1,4 @@ -/* +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,8 +17,6 @@ * under the License. */ -#define __STDC_FORMAT_MACROS -#include <inttypes.h> #include <limits> #include <locale> #include <ios> @@ -35,6 +33,13 @@ #include <thrift/async/TEvhttpClientChannel.h> #include <thrift/server/TNonblockingServer.h> // <event.h> +#ifdef HAVE_STDINT_H +#include <stdint.h> +#endif +#ifdef HAVE_INTTYPES_H +#include <inttypes.h> +#endif + #include <boost/shared_ptr.hpp> #include <boost/program_options.hpp> #include <boost/filesystem.hpp> @@ -355,6 +360,10 @@ int main(int argc, char** argv) { } try { +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4566 ) +#endif string str( "}{Afrikaans, Alemannisch, Aragonés, اÙعربÙØ©, ٠صرÙ, " "Asturianu, Aymar aru, AzÉrbaycan, ÐаÑҡоÑÑ, Boarisch, ŽemaitÄÅ¡ka, " @@ -381,6 +390,9 @@ int main(int argc, char** argv) { "Türkçe, ТаÑаÑÑа/Tatarça, УкÑаÑнÑÑка, اردÙ, Tiếng Viá»t, Volapük, " "Walon, Winaray, å´è¯, isiXhosa, ××Ö´××ש, Yorùbá, Zeêuws, ä¸æ, " "Bân-lâm-gú, ç²µèª"); +#ifdef _MSC_VER +#pragma warning( pop ) +#endif cout << "testString(" << str << ") = " << flush; testClient.testString(s, str); cout << s << endl; @@ -457,10 +469,10 @@ int main(int argc, char** argv) { BASETYPE_IDENTITY_TEST(testI64, (int64_t)-1); BASETYPE_IDENTITY_TEST(testI64, (int64_t)7000000000000000123LL); BASETYPE_IDENTITY_TEST(testI64, (int64_t)-7000000000000000123LL); - BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(2LL, 32)); - BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(2LL, 32)); - BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(2LL, 32) + 1); - BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(2LL, 32) - 1); + BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(static_cast<double>(2LL), 32)); + BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(static_cast<double>(2LL), 32)); + BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(static_cast<double>(2LL), 32) + 1); + BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(static_cast<double>(2LL), 32) - 1); BASETYPE_IDENTITY_TEST(testI64, numeric_limits<int64_t>::max()); BASETYPE_IDENTITY_TEST(testI64, numeric_limits<int64_t>::min()); @@ -472,19 +484,19 @@ int main(int argc, char** argv) { BASETYPE_IDENTITY_TEST(testDouble, -1.0); BASETYPE_IDENTITY_TEST(testDouble, -5.2098523); BASETYPE_IDENTITY_TEST(testDouble, -0.000341012439638598279); - BASETYPE_IDENTITY_TEST(testDouble, pow(2, 32)); - BASETYPE_IDENTITY_TEST(testDouble, pow(2, 32) + 1); - BASETYPE_IDENTITY_TEST(testDouble, pow(2, 53) - 1); - BASETYPE_IDENTITY_TEST(testDouble, -pow(2, 32)); - BASETYPE_IDENTITY_TEST(testDouble, -pow(2, 32) - 1); - BASETYPE_IDENTITY_TEST(testDouble, -pow(2, 53) + 1); + BASETYPE_IDENTITY_TEST(testDouble, pow(static_cast<double>(2), 32)); + BASETYPE_IDENTITY_TEST(testDouble, pow(static_cast<double>(2), 32) + 1); + BASETYPE_IDENTITY_TEST(testDouble, pow(static_cast<double>(2), 53) - 1); + BASETYPE_IDENTITY_TEST(testDouble, -pow(static_cast<double>(2), 32)); + BASETYPE_IDENTITY_TEST(testDouble, -pow(static_cast<double>(2), 32) - 1); + BASETYPE_IDENTITY_TEST(testDouble, -pow(static_cast<double>(2), 53) + 1); try { - double expected = pow(10, 307); + double expected = pow(static_cast<double>(10), 307); cout << "testDouble(" << expected << ") = " << flush; double actual = testClient.testDouble(expected); cout << "(" << actual << ")" << endl; - if (expected - actual > pow(10, 292)) { + if (expected - actual > pow(static_cast<double>(10), 292)) { cout << "*** FAILED ***" << endl << "Expected: " << expected << " but got: " << actual << endl; } @@ -496,11 +508,11 @@ int main(int argc, char** argv) { } try { - double expected = pow(10, -292); + double expected = pow(static_cast<double>(10), -292); cout << "testDouble(" << expected << ") = " << flush; double actual = testClient.testDouble(expected); cout << "(" << actual << ")" << endl; - if (expected - actual > pow(10, -307)) { + if (expected - actual > pow(static_cast<double>(10), -307)) { cout << "*** FAILED ***" << endl << "Expected: " << expected << " but got: " << actual << endl; } http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/test/cpp/src/TestServer.cpp ---------------------------------------------------------------------- diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp index b437860..b86b34c 100644 --- a/test/cpp/src/TestServer.cpp +++ b/test/cpp/src/TestServer.cpp @@ -17,9 +17,6 @@ * under the License. */ -#define __STDC_FORMAT_MACROS -#include <inttypes.h> - #include <thrift/concurrency/ThreadManager.h> #include <thrift/concurrency/PlatformThreadFactory.h> #include <thrift/protocol/TBinaryProtocol.h> @@ -41,6 +38,13 @@ #include <thrift/transport/TTransportUtils.h> #include "ThriftTest.h" +#ifdef HAVE_STDINT_H +#include <stdint.h> +#endif +#ifdef HAVE_INTTYPES_H +#include <inttypes.h> +#endif + #include <iostream> #include <stdexcept> #include <sstream> http://git-wip-us.apache.org/repos/asf/thrift/blob/7edc8fae/tutorial/cpp/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/tutorial/cpp/CMakeLists.txt b/tutorial/cpp/CMakeLists.txt index 1feec2c..8634b41 100644 --- a/tutorial/cpp/CMakeLists.txt +++ b/tutorial/cpp/CMakeLists.txt @@ -44,9 +44,13 @@ add_custom_command(OUTPUT gen-cpp/Calculator.cpp gen-cpp/SharedService.cpp gen-c add_executable(TutorialServer CppServer.cpp) target_link_libraries(TutorialServer tutorialgencpp) LINK_AGAINST_THRIFT_LIBRARY(TutorialServer thrift) -target_link_libraries(TutorialServer ${ZLIB_LIBRARIES}) +if (ZLIB_FOUND) + target_link_libraries(TutorialServer ${ZLIB_LIBRARIES}) +endif () add_executable(TutorialClient CppClient.cpp) target_link_libraries(TutorialClient tutorialgencpp) LINK_AGAINST_THRIFT_LIBRARY(TutorialClient thrift) -target_link_libraries(TutorialClient ${ZLIB_LIBRARIES}) +if (ZLIB_FOUND) + target_link_libraries(TutorialClient ${ZLIB_LIBRARIES}) +endif ()