Commit 20396a17 authored by Frank Benkstein's avatar Frank Benkstein Committed by Wouter van Oortmerssen

disallow c style casts (#4981)

Fixes #4857.
parent a3d8391f
...@@ -130,6 +130,7 @@ if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") ...@@ -130,6 +130,7 @@ if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
elseif(APPLE) elseif(APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Wno-unused-parameter") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Wno-unused-parameter")
set(FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wold-style-cast")
elseif(CMAKE_COMPILER_IS_GNUCXX) elseif(CMAKE_COMPILER_IS_GNUCXX)
if(CYGWIN) if(CYGWIN)
set(CMAKE_CXX_FLAGS set(CMAKE_CXX_FLAGS
...@@ -140,6 +141,7 @@ elseif(CMAKE_COMPILER_IS_GNUCXX) ...@@ -140,6 +141,7 @@ elseif(CMAKE_COMPILER_IS_GNUCXX)
endif(CYGWIN) endif(CYGWIN)
set(CMAKE_CXX_FLAGS set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Werror=shadow") "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Werror=shadow")
set(FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wold-style-cast")
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.4) if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.4)
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0) if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0)
set(CMAKE_CXX_FLAGS set(CMAKE_CXX_FLAGS
...@@ -157,6 +159,7 @@ elseif(CMAKE_COMPILER_IS_GNUCXX) ...@@ -157,6 +159,7 @@ elseif(CMAKE_COMPILER_IS_GNUCXX)
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
set(CMAKE_CXX_FLAGS set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra -Wno-unused-parameter") "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra -Wno-unused-parameter")
set(FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wold-style-cast")
if(FLATBUFFERS_LIBCXX_WITH_CLANG) if(FLATBUFFERS_LIBCXX_WITH_CLANG)
if(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "Linux") if(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
set(CMAKE_CXX_FLAGS set(CMAKE_CXX_FLAGS
...@@ -200,10 +203,12 @@ if(FLATBUFFERS_BUILD_FLATLIB) ...@@ -200,10 +203,12 @@ if(FLATBUFFERS_BUILD_FLATLIB)
# CMake > 2.8.11: Attach header directory for when build via add_subdirectory(). # CMake > 2.8.11: Attach header directory for when build via add_subdirectory().
target_include_directories(flatbuffers INTERFACE target_include_directories(flatbuffers INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>) $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
target_compile_options(flatbuffers PRIVATE "${FLATBUFFERS_PRIVATE_CXX_FLAGS}")
endif() endif()
if(FLATBUFFERS_BUILD_FLATC) if(FLATBUFFERS_BUILD_FLATC)
add_executable(flatc ${FlatBuffers_Compiler_SRCS}) add_executable(flatc ${FlatBuffers_Compiler_SRCS})
target_compile_options(flatc PRIVATE "${FLATBUFFERS_PRIVATE_CXX_FLAGS}")
if(NOT FLATBUFFERS_FLATC_EXECUTABLE) if(NOT FLATBUFFERS_FLATC_EXECUTABLE)
set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>) set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>)
endif() endif()
...@@ -259,6 +264,7 @@ if(FLATBUFFERS_BUILD_TESTS) ...@@ -259,6 +264,7 @@ if(FLATBUFFERS_BUILD_TESTS)
compile_flatbuffers_schema_to_cpp(tests/monster_test.fbs) compile_flatbuffers_schema_to_cpp(tests/monster_test.fbs)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/tests) include_directories(${CMAKE_CURRENT_BINARY_DIR}/tests)
add_executable(flattests ${FlatBuffers_Tests_SRCS}) add_executable(flattests ${FlatBuffers_Tests_SRCS})
target_compile_options(flattests PRIVATE "${FLATBUFFERS_PRIVATE_CXX_FLAGS}")
set_property(TARGET flattests set_property(TARGET flattests
PROPERTY COMPILE_DEFINITIONS FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE PROPERTY COMPILE_DEFINITIONS FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
FLATBUFFERS_DEBUG_VERIFICATION_FAILURE=1) FLATBUFFERS_DEBUG_VERIFICATION_FAILURE=1)
......
...@@ -72,13 +72,14 @@ void GenerateImports(grpc_generator::File* file, ...@@ -72,13 +72,14 @@ void GenerateImports(grpc_generator::File* file,
// - remove embedded underscores & capitalize the following letter // - remove embedded underscores & capitalize the following letter
static string MixedLower(const string& word) { static string MixedLower(const string& word) {
string w; string w;
w += (string::value_type)tolower(word[0]); w += static_cast<string::value_type>(tolower(word[0]));
bool after_underscore = false; bool after_underscore = false;
for (size_t i = 1; i < word.length(); ++i) { for (size_t i = 1; i < word.length(); ++i) {
if (word[i] == '_') { if (word[i] == '_') {
after_underscore = true; after_underscore = true;
} else { } else {
w += after_underscore ? (string::value_type)toupper(word[i]) : word[i]; w += after_underscore ? static_cast<string::value_type>(toupper(word[i]))
: word[i];
after_underscore = false; after_underscore = false;
} }
} }
...@@ -92,7 +93,7 @@ static string MixedLower(const string& word) { ...@@ -92,7 +93,7 @@ static string MixedLower(const string& word) {
static string ToAllUpperCase(const string& word) { static string ToAllUpperCase(const string& word) {
string w; string w;
for (size_t i = 0; i < word.length(); ++i) { for (size_t i = 0; i < word.length(); ++i) {
w += (string::value_type)toupper(word[i]); w += static_cast<string::value_type>(toupper(word[i]));
if ((i < word.length() - 1) && islower(word[i]) && isupper(word[i + 1])) { if ((i < word.length() - 1) && islower(word[i]) && isupper(word[i + 1])) {
w += '_'; w += '_';
} }
...@@ -345,8 +346,8 @@ static void PrintMethodFields(Printer* p, VARS& vars, ...@@ -345,8 +346,8 @@ static void PrintMethodFields(Printer* p, VARS& vars,
for (int i = 0; i < service->method_count(); ++i) { for (int i = 0; i < service->method_count(); ++i) {
auto method = service->method(i); auto method = service->method(i);
vars["arg_in_id"] = to_string((long)2 * i); //trying to make msvc 10 happy vars["arg_in_id"] = to_string(2L * i); //trying to make msvc 10 happy
vars["arg_out_id"] = to_string((long)2 * i + 1); vars["arg_out_id"] = to_string(2L * i + 1);
vars["method_name"] = method->name(); vars["method_name"] = method->name();
vars["input_type_name"] = method->get_input_type_name(); vars["input_type_name"] = method->get_input_type_name();
vars["output_type_name"] = method->get_output_type_name(); vars["output_type_name"] = method->get_output_type_name();
......
...@@ -1503,7 +1503,7 @@ class FlatBufferBuilder { ...@@ -1503,7 +1503,7 @@ class FlatBufferBuilder {
extern T Pack(const S &); extern T Pack(const S &);
typedef T (*Pack_t)(const S &); typedef T (*Pack_t)(const S &);
std::vector<T> vv(len); std::vector<T> vv(len);
std::transform(v, v + len, vv.begin(), *(Pack_t)&Pack); std::transform(v, v + len, vv.begin(), static_cast<Pack_t&>(Pack));
return CreateVectorOfStructs<T>(vv.data(), vv.size()); return CreateVectorOfStructs<T>(vv.data(), vv.size());
} }
...@@ -1641,7 +1641,7 @@ class FlatBufferBuilder { ...@@ -1641,7 +1641,7 @@ class FlatBufferBuilder {
extern T Pack(const S &); extern T Pack(const S &);
typedef T (*Pack_t)(const S &); typedef T (*Pack_t)(const S &);
std::vector<T> vv(len); std::vector<T> vv(len);
std::transform(v, v + len, vv.begin(), *(Pack_t)&Pack); std::transform(v, v + len, vv.begin(), static_cast<Pack_t&>(Pack));
return CreateVectorOfSortedStructs<T>(vv, len); return CreateVectorOfSortedStructs<T>(vv, len);
} }
......
...@@ -228,7 +228,7 @@ inline std::string GetAnyVectorElemS(const VectorOfAny *vec, ...@@ -228,7 +228,7 @@ inline std::string GetAnyVectorElemS(const VectorOfAny *vec,
template<typename T> template<typename T>
T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) { T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) {
auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i; auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i;
return (T *)(elem_ptr + ReadScalar<uoffset_t>(elem_ptr)); return reinterpret_cast<T*>(elem_ptr + ReadScalar<uoffset_t>(elem_ptr));
} }
// Get the inline-address of a vector element. Useful for Structs (pass Struct // Get the inline-address of a vector element. Useful for Structs (pass Struct
...@@ -239,20 +239,19 @@ T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) { ...@@ -239,20 +239,19 @@ T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) {
template<typename T> template<typename T>
T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, size_t i, T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, size_t i,
size_t elem_size) { size_t elem_size) {
// C-cast to allow const conversion. return reinterpret_cast<T *>(vec->Data() + elem_size * i);
return (T *)(vec->Data() + elem_size * i);
} }
// Similarly, for elements of tables. // Similarly, for elements of tables.
template<typename T> template<typename T>
T *GetAnyFieldAddressOf(const Table &table, const reflection::Field &field) { T *GetAnyFieldAddressOf(const Table &table, const reflection::Field &field) {
return (T *)table.GetAddressOf(field.offset()); return reinterpret_cast<T *>(table.GetAddressOf(field.offset()));
} }
// Similarly, for elements of structs. // Similarly, for elements of structs.
template<typename T> template<typename T>
T *GetAnyFieldAddressOf(const Struct &st, const reflection::Field &field) { T *GetAnyFieldAddressOf(const Struct &st, const reflection::Field &field) {
return (T *)st.GetAddressOf(field.offset()); return reinterpret_cast<T *>(st.GetAddressOf(field.offset()));
} }
// ------------------------- SETTERS ------------------------- // ------------------------- SETTERS -------------------------
......
...@@ -2163,9 +2163,11 @@ class CppGenerator : public BaseGenerator { ...@@ -2163,9 +2163,11 @@ class CppGenerator : public BaseGenerator {
auto cpp_type = field.attributes.Lookup("cpp_type"); auto cpp_type = field.attributes.Lookup("cpp_type");
std::string indexing; std::string indexing;
if (field.value.type.enum_def) { if (field.value.type.enum_def) {
indexing += "(" + WrapInNameSpace(*field.value.type.enum_def) + ")"; indexing += "static_cast<" +
WrapInNameSpace(*field.value.type.enum_def) + ">(";
} }
indexing += "_e->Get(_i)"; indexing += "_e->Get(_i)";
if (field.value.type.enum_def) { indexing += ")"; }
if (field.value.type.element == BASE_TYPE_BOOL) { indexing += " != 0"; } if (field.value.type.element == BASE_TYPE_BOOL) { indexing += " != 0"; }
// Generate code that pushes data from _e to _o in the form: // Generate code that pushes data from _e to _o in the form:
......
...@@ -395,7 +395,7 @@ static void StructBuilderArgs(const StructDef &struct_def, ...@@ -395,7 +395,7 @@ static void StructBuilderArgs(const StructDef &struct_def,
(nameprefix + (field.name + "_")).c_str(), code_ptr); (nameprefix + (field.name + "_")).c_str(), code_ptr);
} else { } else {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += (std::string) ", " + nameprefix; code += std::string(", ") + nameprefix;
code += GoIdentity(field.name); code += GoIdentity(field.name);
code += " " + GenTypeBasic(field.value.type); code += " " + GenTypeBasic(field.value.type);
} }
......
...@@ -459,8 +459,9 @@ class JsGenerator : public BaseGenerator { ...@@ -459,8 +459,9 @@ class JsGenerator : public BaseGenerator {
case BASE_TYPE_LONG: case BASE_TYPE_LONG:
case BASE_TYPE_ULONG: { case BASE_TYPE_ULONG: {
int64_t constant = StringToInt(value.constant.c_str()); int64_t constant = StringToInt(value.constant.c_str());
return context + ".createLong(" + NumToString((int32_t)constant) + return context + ".createLong(" +
", " + NumToString((int32_t)(constant >> 32)) + ")"; NumToString(static_cast<int32_t>(constant)) + ", " +
NumToString(static_cast<int32_t>(constant >> 32)) + ")";
} }
default: return value.constant; default: return value.constant;
......
...@@ -362,7 +362,7 @@ namespace lua { ...@@ -362,7 +362,7 @@ namespace lua {
} }
else { else {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += (std::string) ", " + nameprefix; code += std::string(", ") + nameprefix;
code += MakeCamel(NormalizedName(field), false); code += MakeCamel(NormalizedName(field), false);
} }
} }
......
...@@ -454,7 +454,7 @@ class PhpGenerator : public BaseGenerator { ...@@ -454,7 +454,7 @@ class PhpGenerator : public BaseGenerator {
(nameprefix + (field.name + "_")).c_str(), code_ptr); (nameprefix + (field.name + "_")).c_str(), code_ptr);
} else { } else {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += (std::string) ", $" + nameprefix; code += std::string(", $") + nameprefix;
code += MakeCamel(field.name, false); code += MakeCamel(field.name, false);
} }
} }
......
...@@ -383,7 +383,7 @@ class PythonGenerator : public BaseGenerator { ...@@ -383,7 +383,7 @@ class PythonGenerator : public BaseGenerator {
(nameprefix + (NormalizedName(field) + "_")).c_str(), code_ptr); (nameprefix + (NormalizedName(field) + "_")).c_str(), code_ptr);
} else { } else {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += (std::string) ", " + nameprefix; code += std::string(", ") + nameprefix;
code += MakeCamel(NormalizedName(field), false); code += MakeCamel(NormalizedName(field), false);
} }
} }
......
...@@ -46,7 +46,7 @@ void FlatBufferBuilderTest(); ...@@ -46,7 +46,7 @@ void FlatBufferBuilderTest();
// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator // http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator
uint32_t lcg_seed = 48271; uint32_t lcg_seed = 48271;
uint32_t lcg_rand() { uint32_t lcg_rand() {
return lcg_seed = ((uint64_t)lcg_seed * 279470273UL) % 4294967291UL; return lcg_seed = (static_cast<uint64_t>(lcg_seed) * 279470273UL) % 4294967291UL;
} }
void lcg_reset() { lcg_seed = 48271; } void lcg_reset() { lcg_seed = 48271; }
...@@ -1279,12 +1279,12 @@ bool FloatCompare(float a, float b) { return fabs(a - b) < 0.001; } ...@@ -1279,12 +1279,12 @@ bool FloatCompare(float a, float b) { return fabs(a - b) < 0.001; }
void ValueTest() { void ValueTest() {
// Test scientific notation numbers. // Test scientific notation numbers.
TEST_EQ(FloatCompare(TestValue<float>("{ Y:0.0314159e+2 }", "float"), TEST_EQ(FloatCompare(TestValue<float>("{ Y:0.0314159e+2 }", "float"),
(float)3.14159), 3.14159f),
true); true);
// number in string // number in string
TEST_EQ(FloatCompare(TestValue<float>("{ Y:\"0.0314159e+2\" }", "float"), TEST_EQ(FloatCompare(TestValue<float>("{ Y:\"0.0314159e+2\" }", "float"),
(float)3.14159), 3.14159f),
true); true);
// Test conversion functions. // Test conversion functions.
TEST_EQ(FloatCompare(TestValue<float>("{ Y:cos(rad(180)) }", "float"), -1), TEST_EQ(FloatCompare(TestValue<float>("{ Y:cos(rad(180)) }", "float"), -1),
...@@ -1454,12 +1454,12 @@ void ValidFloatTest() { ...@@ -1454,12 +1454,12 @@ void ValidFloatTest() {
TEST_EQ(TestValue<double>("{ Y:+1.7977e+308 }", "double"), +infinityd); TEST_EQ(TestValue<double>("{ Y:+1.7977e+308 }", "double"), +infinityd);
TEST_EQ(TestValue<double>("{ Y:-1.7977e+308 }", "double"), -infinityd); TEST_EQ(TestValue<double>("{ Y:-1.7977e+308 }", "double"), -infinityd);
TEST_EQ(FloatCompare(TestValue<float>("{ Y:0.0314159e+2 }", "float"), TEST_EQ(
(float)3.14159), FloatCompare(TestValue<float>("{ Y:0.0314159e+2 }", "float"), 3.14159f),
true); true);
// float in string // float in string
TEST_EQ(FloatCompare(TestValue<float>("{ Y:\" 0.0314159e+2 \" }", "float"), TEST_EQ(FloatCompare(TestValue<float>("{ Y:\" 0.0314159e+2 \" }", "float"),
(float)3.14159), 3.14159f),
true); true);
TEST_EQ(TestValue<float>("{ Y:1 }", "float"), 1.0f); TEST_EQ(TestValue<float>("{ Y:1 }", "float"), 1.0f);
......
...@@ -477,7 +477,7 @@ inline void Movie::UnPackTo(MovieT *_o, const flatbuffers::resolver_function_t * ...@@ -477,7 +477,7 @@ inline void Movie::UnPackTo(MovieT *_o, const flatbuffers::resolver_function_t *
(void)_resolver; (void)_resolver;
{ auto _e = main_character_type(); _o->main_character.type = _e; }; { auto _e = main_character_type(); _o->main_character.type = _e; };
{ auto _e = main_character(); if (_e) _o->main_character.value = CharacterUnion::UnPack(_e, main_character_type(), _resolver); }; { auto _e = main_character(); if (_e) _o->main_character.value = CharacterUnion::UnPack(_e, main_character_type(), _resolver); };
{ auto _e = characters_type(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].type = (Character)_e->Get(_i); } } }; { auto _e = characters_type(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].type = static_cast<Character>(_e->Get(_i)); } } };
{ auto _e = characters(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].value = CharacterUnion::UnPack(_e->Get(_i), characters_type()->GetEnum<Character>(_i), _resolver); } } }; { auto _e = characters(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].value = CharacterUnion::UnPack(_e->Get(_i), characters_type()->GetEnum<Character>(_i), _resolver); } } };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment