diff --git a/addons/cert.py b/addons/cert.py index 5a019152d..fb223f435 100755 --- a/addons/cert.py +++ b/addons/cert.py @@ -179,32 +179,43 @@ def int31(data, platform): if not platform: return for token in data.tokenlist: - if not isCast(token): + to_value_type = None + from_values = None + action = '' + if isCast(token): + to_value_type = token.valueType + from_values = token.astOperand1.values + action = 'casting' + elif token.str == '=' and token.astOperand1 and token.astOperand2: + to_value_type = token.astOperand1.valueType + from_values = token.astOperand2.values + action = 'assign' + else: continue - if not token.valueType or not token.astOperand1.values: + if to_value_type is None or not from_values: continue bits = None - if token.valueType.type == 'char': + if to_value_type.type == 'char': bits = platform.char_bit - elif token.valueType.type == 'short': + elif to_value_type.type == 'short': bits = platform.short_bit - elif token.valueType.type == 'int': + elif to_value_type.type == 'int': bits = platform.int_bit - elif token.valueType.type == 'long': + elif to_value_type.type == 'long': bits = platform.long_bit - elif token.valueType.type == 'long long': + elif to_value_type.type == 'long long': bits = platform.long_long_bit else: continue - if token.valueType.sign == 'unsigned': + if to_value_type.sign == 'unsigned': found = False - for value in token.astOperand1.values: + for value in from_values: if value.intvalue and value.intvalue < 0: found = True reportError( token, 'style', - 'Ensure that integer conversions do not result in lost or misinterpreted data (casting ' + str(value.intvalue) + ' to unsigned ' + token.valueType.type + ')', + 'Ensure that integer conversions do not result in lost or misinterpreted data (' + action + ' ' + str(value.intvalue) + ' to unsigned ' + token.valueType.type + ')', 'INT31-c') break if found: @@ -219,7 +230,7 @@ def int31(data, platform): else: minval = 0 maxval = ((1 << bits) - 1) - for value in token.astOperand1.values: + for value in from_values: if value.intvalue and (value.intvalue < minval or value.intvalue > maxval): destType = '' if token.valueType.sign: @@ -229,7 +240,7 @@ def int31(data, platform): reportError( token, 'style', - 'Ensure that integer conversions do not result in lost or misinterpreted data (casting ' + str(value.intvalue) + ' to ' + destType + ')', + 'Ensure that integer conversions do not result in lost or misinterpreted data (' + action + ' ' + str(value.intvalue) + ' to ' + destType + ')', 'INT31-c') break diff --git a/addons/test/cert-test.c b/addons/test/cert-test.c index 2b6d826b1..15a3e7237 100644 --- a/addons/test/cert-test.c +++ b/addons/test/cert-test.c @@ -73,12 +73,15 @@ void exp46(int x, int y, int z) if ((x == y) & z) {} // cert-EXP46-c } -unsigned char int31(int x) +void int31(int x) { x = (unsigned char)1000; // cert-INT31-c x = (signed char)0xff; // cert-INT31-c x = (unsigned char)-1; // cert-INT31-c x = (unsigned long long)-1; // cert-INT31-c + unsigned char c; + c = 256; + c = -1; } void env33() diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 68036e197..aafbe9268 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -538,6 +538,7 @@ namespace { for (const tinyxml2::XMLElement *e1 = idg->FirstChildElement(); e1; e1 = e1->NextSiblingElement()) { if (std::strcmp(e1->Name(), "ClCompile") != 0) continue; + enhancedInstructionSet = "StreamingSIMDExtensions2"; for (const tinyxml2::XMLElement *e = e1->FirstChildElement(); e; e = e->NextSiblingElement()) { if (e->GetText()) { if (std::strcmp(e->Name(), "PreprocessorDefinitions") == 0) @@ -555,6 +556,8 @@ namespace { cppstd = Standards::CPP20; else if (std::strcmp(e->GetText(), "stdcpplatest") == 0) cppstd = Standards::CPPLatest; + } else if (std::strcmp(e->Name(), "EnableEnhancedInstructionSet") == 0) { + enhancedInstructionSet = e->GetText(); } } } @@ -592,6 +595,7 @@ namespace { return false; } std::string condition; + std::string enhancedInstructionSet; std::string preprocessorDefinitions; std::string additionalIncludePaths; Standards::cppstd_t cppstd = Standards::CPPLatest; @@ -796,6 +800,16 @@ bool ImportProject::importVcxproj(const std::string &filename, std::map