Misra: Add rule 16.3
This commit is contained in:
parent
aa2d1fd683
commit
174bcc8d34
|
@ -122,3 +122,17 @@ void misra_16_2() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void misra_16_3() {
|
||||||
|
switch (x) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
a=1;
|
||||||
|
case 3: // 16.3
|
||||||
|
a=2;
|
||||||
|
// fallthrough
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -419,6 +419,26 @@ def misra_16_2(data):
|
||||||
if token.str == 'case' and token.scope.type != 'Switch':
|
if token.str == 'case' and token.scope.type != 'Switch':
|
||||||
reportError(token, 16, 2)
|
reportError(token, 16, 2)
|
||||||
|
|
||||||
|
# The goal is handle comments/annotations by other tools
|
||||||
|
def misra_16_3(rawTokens):
|
||||||
|
# state: 0=no, 1=break is seen but not its ';', 2=after 'break;', 'comment', '{'
|
||||||
|
state = 0
|
||||||
|
for token in rawTokens:
|
||||||
|
if token.str == 'break':
|
||||||
|
state = 1
|
||||||
|
elif token.str == ';':
|
||||||
|
if state == 1:
|
||||||
|
state = 2
|
||||||
|
else:
|
||||||
|
state = 0
|
||||||
|
elif token.str.startswith('/*') or token.str.startswith('//'):
|
||||||
|
if token.str.lower().find('fallthrough')>0:
|
||||||
|
state = 2
|
||||||
|
elif token.str == '{':
|
||||||
|
state = 2
|
||||||
|
elif token.str == 'case' and state != 2:
|
||||||
|
reportError(token, 16, 3)
|
||||||
|
|
||||||
for arg in sys.argv[1:]:
|
for arg in sys.argv[1:]:
|
||||||
print('Checking ' + arg + '...')
|
print('Checking ' + arg + '...')
|
||||||
data = cppcheckdata.parsedump(arg)
|
data = cppcheckdata.parsedump(arg)
|
||||||
|
@ -455,4 +475,6 @@ for arg in sys.argv[1:]:
|
||||||
misra_15_6(data.rawTokens)
|
misra_15_6(data.rawTokens)
|
||||||
misra_15_7(cfg)
|
misra_15_7(cfg)
|
||||||
misra_16_2(cfg)
|
misra_16_2(cfg)
|
||||||
|
if cfgNumber == 1:
|
||||||
|
misra_16_3(data.rawTokens)
|
||||||
|
|
||||||
|
|
|
@ -135,6 +135,28 @@ unsigned int CppCheck::processFile(const std::string& filename, const std::strin
|
||||||
simplecpp::TokenList tokens1(fileStream, files, filename, &outputList);
|
simplecpp::TokenList tokens1(fileStream, files, filename, &outputList);
|
||||||
preprocessor.loadFiles(tokens1, files);
|
preprocessor.loadFiles(tokens1, files);
|
||||||
|
|
||||||
|
// write dump file xml prolog
|
||||||
|
std::ofstream fdump;
|
||||||
|
if (_settings.dump) {
|
||||||
|
const std::string dumpfile(filename + ".dump");
|
||||||
|
fdump.open(dumpfile.c_str());
|
||||||
|
if (fdump.is_open()) {
|
||||||
|
fdump << "<?xml version=\"1.0\"?>" << std::endl;
|
||||||
|
fdump << "<dumps>" << std::endl;
|
||||||
|
fdump << " <rawtokens>" << std::endl;
|
||||||
|
for (unsigned int i = 0; i < files.size(); ++i)
|
||||||
|
fdump << " <file index=\"" << i << "\" name=\"" << ErrorLogger::toxml(files[i]) << "\"/>" << std::endl;
|
||||||
|
for (const simplecpp::Token *tok = tokens1.cfront(); tok; tok = tok->next) {
|
||||||
|
fdump << " <tok "
|
||||||
|
<< "fileIndex=\"" << tok->location.fileIndex << "\" "
|
||||||
|
<< "linenr=\"" << tok->location.line << "\" "
|
||||||
|
<< "str=\"" << ErrorLogger::toxml(tok->str) << "\""
|
||||||
|
<< "/>" << std::endl;
|
||||||
|
}
|
||||||
|
fdump << " </rawtokens>" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Parse comments and then remove them
|
// Parse comments and then remove them
|
||||||
preprocessor.inlineSuppressions(tokens1);
|
preprocessor.inlineSuppressions(tokens1);
|
||||||
tokens1.removeComments();
|
tokens1.removeComments();
|
||||||
|
@ -209,28 +231,6 @@ unsigned int CppCheck::processFile(const std::string& filename, const std::strin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// write dump file xml prolog
|
|
||||||
std::ofstream fdump;
|
|
||||||
if (_settings.dump) {
|
|
||||||
const std::string dumpfile(filename + ".dump");
|
|
||||||
fdump.open(dumpfile.c_str());
|
|
||||||
if (fdump.is_open()) {
|
|
||||||
fdump << "<?xml version=\"1.0\"?>" << std::endl;
|
|
||||||
fdump << "<dumps>" << std::endl;
|
|
||||||
fdump << " <rawtokens>" << std::endl;
|
|
||||||
for (unsigned int i = 0; i < files.size(); ++i)
|
|
||||||
fdump << " <file index=\"" << i << "\" name=\"" << ErrorLogger::toxml(files[i]) << "\"/>" << std::endl;
|
|
||||||
for (const simplecpp::Token *tok = tokens1.cfront(); tok; tok = tok->next) {
|
|
||||||
fdump << " <tok "
|
|
||||||
<< "fileIndex=\"" << tok->location.fileIndex << "\" "
|
|
||||||
<< "linenr=\"" << tok->location.line << "\" "
|
|
||||||
<< "str=\"" << ErrorLogger::toxml(tok->str) << "\""
|
|
||||||
<< "/>" << std::endl;
|
|
||||||
}
|
|
||||||
fdump << " </rawtokens>" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::set<unsigned long long> checksums;
|
std::set<unsigned long long> checksums;
|
||||||
unsigned int checkCount = 0;
|
unsigned int checkCount = 0;
|
||||||
for (std::set<std::string>::const_iterator it = configurations.begin(); it != configurations.end(); ++it) {
|
for (std::set<std::string>::const_iterator it = configurations.begin(); it != configurations.end(); ++it) {
|
||||||
|
|
Loading…
Reference in New Issue