cert: improved check for int31-c
This commit is contained in:
parent
7f9ef8c321
commit
ebd1fbbfd8
|
@ -179,32 +179,43 @@ def int31(data, platform):
|
||||||
if not platform:
|
if not platform:
|
||||||
return
|
return
|
||||||
for token in data.tokenlist:
|
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
|
continue
|
||||||
if not token.valueType or not token.astOperand1.values:
|
if to_value_type is None or not from_values:
|
||||||
continue
|
continue
|
||||||
bits = None
|
bits = None
|
||||||
if token.valueType.type == 'char':
|
if to_value_type.type == 'char':
|
||||||
bits = platform.char_bit
|
bits = platform.char_bit
|
||||||
elif token.valueType.type == 'short':
|
elif to_value_type.type == 'short':
|
||||||
bits = platform.short_bit
|
bits = platform.short_bit
|
||||||
elif token.valueType.type == 'int':
|
elif to_value_type.type == 'int':
|
||||||
bits = platform.int_bit
|
bits = platform.int_bit
|
||||||
elif token.valueType.type == 'long':
|
elif to_value_type.type == 'long':
|
||||||
bits = platform.long_bit
|
bits = platform.long_bit
|
||||||
elif token.valueType.type == 'long long':
|
elif to_value_type.type == 'long long':
|
||||||
bits = platform.long_long_bit
|
bits = platform.long_long_bit
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
if token.valueType.sign == 'unsigned':
|
if to_value_type.sign == 'unsigned':
|
||||||
found = False
|
found = False
|
||||||
for value in token.astOperand1.values:
|
for value in from_values:
|
||||||
if value.intvalue and value.intvalue < 0:
|
if value.intvalue and value.intvalue < 0:
|
||||||
found = True
|
found = True
|
||||||
reportError(
|
reportError(
|
||||||
token,
|
token,
|
||||||
'style',
|
'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')
|
'INT31-c')
|
||||||
break
|
break
|
||||||
if found:
|
if found:
|
||||||
|
@ -219,7 +230,7 @@ def int31(data, platform):
|
||||||
else:
|
else:
|
||||||
minval = 0
|
minval = 0
|
||||||
maxval = ((1 << bits) - 1)
|
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):
|
if value.intvalue and (value.intvalue < minval or value.intvalue > maxval):
|
||||||
destType = ''
|
destType = ''
|
||||||
if token.valueType.sign:
|
if token.valueType.sign:
|
||||||
|
@ -229,7 +240,7 @@ def int31(data, platform):
|
||||||
reportError(
|
reportError(
|
||||||
token,
|
token,
|
||||||
'style',
|
'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')
|
'INT31-c')
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
|
@ -73,12 +73,15 @@ void exp46(int x, int y, int z)
|
||||||
if ((x == y) & z) {} // cert-EXP46-c
|
if ((x == y) & z) {} // cert-EXP46-c
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char int31(int x)
|
void int31(int x)
|
||||||
{
|
{
|
||||||
x = (unsigned char)1000; // cert-INT31-c
|
x = (unsigned char)1000; // cert-INT31-c
|
||||||
x = (signed char)0xff; // cert-INT31-c
|
x = (signed char)0xff; // cert-INT31-c
|
||||||
x = (unsigned char)-1; // cert-INT31-c
|
x = (unsigned char)-1; // cert-INT31-c
|
||||||
x = (unsigned long long)-1; // cert-INT31-c
|
x = (unsigned long long)-1; // cert-INT31-c
|
||||||
|
unsigned char c;
|
||||||
|
c = 256;
|
||||||
|
c = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void env33()
|
void env33()
|
||||||
|
|
|
@ -538,6 +538,7 @@ namespace {
|
||||||
for (const tinyxml2::XMLElement *e1 = idg->FirstChildElement(); e1; e1 = e1->NextSiblingElement()) {
|
for (const tinyxml2::XMLElement *e1 = idg->FirstChildElement(); e1; e1 = e1->NextSiblingElement()) {
|
||||||
if (std::strcmp(e1->Name(), "ClCompile") != 0)
|
if (std::strcmp(e1->Name(), "ClCompile") != 0)
|
||||||
continue;
|
continue;
|
||||||
|
enhancedInstructionSet = "StreamingSIMDExtensions2";
|
||||||
for (const tinyxml2::XMLElement *e = e1->FirstChildElement(); e; e = e->NextSiblingElement()) {
|
for (const tinyxml2::XMLElement *e = e1->FirstChildElement(); e; e = e->NextSiblingElement()) {
|
||||||
if (e->GetText()) {
|
if (e->GetText()) {
|
||||||
if (std::strcmp(e->Name(), "PreprocessorDefinitions") == 0)
|
if (std::strcmp(e->Name(), "PreprocessorDefinitions") == 0)
|
||||||
|
@ -555,6 +556,8 @@ namespace {
|
||||||
cppstd = Standards::CPP20;
|
cppstd = Standards::CPP20;
|
||||||
else if (std::strcmp(e->GetText(), "stdcpplatest") == 0)
|
else if (std::strcmp(e->GetText(), "stdcpplatest") == 0)
|
||||||
cppstd = Standards::CPPLatest;
|
cppstd = Standards::CPPLatest;
|
||||||
|
} else if (std::strcmp(e->Name(), "EnableEnhancedInstructionSet") == 0) {
|
||||||
|
enhancedInstructionSet = e->GetText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -592,6 +595,7 @@ namespace {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::string condition;
|
std::string condition;
|
||||||
|
std::string enhancedInstructionSet;
|
||||||
std::string preprocessorDefinitions;
|
std::string preprocessorDefinitions;
|
||||||
std::string additionalIncludePaths;
|
std::string additionalIncludePaths;
|
||||||
Standards::cppstd_t cppstd = Standards::CPPLatest;
|
Standards::cppstd_t cppstd = Standards::CPPLatest;
|
||||||
|
@ -796,6 +800,16 @@ bool ImportProject::importVcxproj(const std::string &filename, std::map<std::str
|
||||||
else if (i.cppstd == Standards::CPP20)
|
else if (i.cppstd == Standards::CPP20)
|
||||||
fs.standard = "c++20";
|
fs.standard = "c++20";
|
||||||
fs.defines += ';' + i.preprocessorDefinitions;
|
fs.defines += ';' + i.preprocessorDefinitions;
|
||||||
|
if (i.enhancedInstructionSet == "StreamingSIMDExtensions")
|
||||||
|
fs.defines += ";__SSE__";
|
||||||
|
else if (i.enhancedInstructionSet == "StreamingSIMDExtensions2")
|
||||||
|
fs.defines += ";__SSE2__";
|
||||||
|
else if (i.enhancedInstructionSet == "AdvancedVectorExtensions")
|
||||||
|
fs.defines += ";__AVX__";
|
||||||
|
else if (i.enhancedInstructionSet == "AdvancedVectorExtensions2")
|
||||||
|
fs.defines += ";__AVX2__";
|
||||||
|
else if (i.enhancedInstructionSet == "AdvancedVectorExtensions512")
|
||||||
|
fs.defines += ";__AVX512__";
|
||||||
additionalIncludePaths += ';' + i.additionalIncludePaths;
|
additionalIncludePaths += ';' + i.additionalIncludePaths;
|
||||||
}
|
}
|
||||||
fs.setDefines(fs.defines);
|
fs.setDefines(fs.defines);
|
||||||
|
|
Loading…
Reference in New Issue