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
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)
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_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_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));
}
/**
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 @@
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 @@
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));
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 @@
%%
+#ifdef _MSC_VER
+#pragma warning( pop )
+#endif
+
/* vim: filetype=lex
*/
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>
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