Tokenizer: Remove some functions from simplifyTokenList2
This commit is contained in:
parent
a2b50c1ccf
commit
dbb12cb333
155
lib/tokenize.cpp
155
lib/tokenize.cpp
|
@ -5349,11 +5349,6 @@ bool Tokenizer::simplifyTokenList2()
|
||||||
tok->clearValueFlow();
|
tok->clearValueFlow();
|
||||||
}
|
}
|
||||||
|
|
||||||
// simplify references
|
|
||||||
simplifyReference();
|
|
||||||
|
|
||||||
simplifyStd();
|
|
||||||
|
|
||||||
if (Settings::terminated())
|
if (Settings::terminated())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -5370,12 +5365,6 @@ bool Tokenizer::simplifyTokenList2()
|
||||||
if (Settings::terminated())
|
if (Settings::terminated())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Replace "*(ptr + num)" => "ptr[num]"
|
|
||||||
simplifyOffsetPointerDereference();
|
|
||||||
|
|
||||||
// Replace "&str[num]" => "(str + num)"
|
|
||||||
simplifyOffsetPointerReference();
|
|
||||||
|
|
||||||
simplifyRealloc();
|
simplifyRealloc();
|
||||||
|
|
||||||
// Change initialisation of variable to assignment
|
// Change initialisation of variable to assignment
|
||||||
|
@ -8991,128 +8980,11 @@ void Tokenizer::simplifyTypeIntrinsics()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tokenizer::simplifyReference()
|
|
||||||
{
|
|
||||||
if (isC())
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
|
||||||
// starting executable scope..
|
|
||||||
Token *start = const_cast<Token *>(startOfExecutableScope(tok));
|
|
||||||
if (start) {
|
|
||||||
tok = start;
|
|
||||||
// replace references in this scope..
|
|
||||||
Token * const end = tok->link();
|
|
||||||
for (Token *tok2 = tok; tok2 && tok2 != end; tok2 = tok2->next()) {
|
|
||||||
// found a reference..
|
|
||||||
if (Token::Match(tok2, "[;{}] %type% & %name% (|= %name% )| ;")) {
|
|
||||||
const int refId = tok2->tokAt(3)->varId();
|
|
||||||
if (!refId)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// replace reference in the code..
|
|
||||||
for (Token *tok3 = tok2->tokAt(7); tok3 && tok3 != end; tok3 = tok3->next()) {
|
|
||||||
if (tok3->varId() == refId) {
|
|
||||||
tok3->str(tok2->strAt(5));
|
|
||||||
tok3->varId(tok2->tokAt(5)->varId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tok2->deleteNext(6+(tok2->strAt(6)==")" ? 1 : 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tok = end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Tokenizer::simplifyCalculations()
|
bool Tokenizer::simplifyCalculations()
|
||||||
{
|
{
|
||||||
return mTemplateSimplifier->simplifyCalculations(nullptr, nullptr, false);
|
return mTemplateSimplifier->simplifyCalculations(nullptr, nullptr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tokenizer::simplifyOffsetPointerDereference()
|
|
||||||
{
|
|
||||||
// Replace "*(str + num)" => "str[num]" and
|
|
||||||
// Replace "*(str - num)" => "str[-num]"
|
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
|
||||||
if (!tok->isName() && !tok->isLiteral()
|
|
||||||
&& !Token::Match(tok, "]|)|++|--")
|
|
||||||
&& Token::Match(tok->next(), "* ( %name% +|- %num%|%name% )")) {
|
|
||||||
|
|
||||||
// remove '* ('
|
|
||||||
tok->deleteNext(2);
|
|
||||||
|
|
||||||
// '+'->'['
|
|
||||||
tok = tok->tokAt(2);
|
|
||||||
Token* const openBraceTok = tok;
|
|
||||||
const bool isNegativeIndex = (tok->str() == "-");
|
|
||||||
tok->str("[");
|
|
||||||
|
|
||||||
// Insert a "-" in front of the number or variable
|
|
||||||
if (isNegativeIndex) {
|
|
||||||
if (tok->next()->isName()) {
|
|
||||||
tok->insertToken("-");
|
|
||||||
tok = tok->next();
|
|
||||||
} else
|
|
||||||
tok->next()->str(std::string("-") + tok->next()->str());
|
|
||||||
}
|
|
||||||
|
|
||||||
tok = tok->tokAt(2);
|
|
||||||
tok->str("]");
|
|
||||||
Token::createMutualLinks(openBraceTok, tok);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tokenizer::simplifyOffsetPointerReference()
|
|
||||||
{
|
|
||||||
std::set<int> pod;
|
|
||||||
for (const Token *tok = list.front(); tok; tok = tok->next()) {
|
|
||||||
if (tok->isStandardType()) {
|
|
||||||
tok = tok->next();
|
|
||||||
while (tok && (tok->str() == "*" || tok->isName())) {
|
|
||||||
if (tok->varId() > 0) {
|
|
||||||
pod.insert(tok->varId());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tok = tok->next();
|
|
||||||
}
|
|
||||||
if (!tok)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
|
||||||
if (!Token::Match(tok, "%num%|%name%|]|)") &&
|
|
||||||
(Token::Match(tok->next(), "& %name% [ %num%|%name% ] !!["))) {
|
|
||||||
tok = tok->next();
|
|
||||||
|
|
||||||
if (tok->next()->varId()) {
|
|
||||||
if (pod.find(tok->next()->varId()) == pod.end()) {
|
|
||||||
tok = tok->tokAt(5);
|
|
||||||
if (!tok)
|
|
||||||
syntaxError(tok);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// '&' => '('
|
|
||||||
tok->str("(");
|
|
||||||
|
|
||||||
tok = tok->next();
|
|
||||||
// '[' => '+'
|
|
||||||
tok->deleteNext();
|
|
||||||
tok->insertToken("+");
|
|
||||||
|
|
||||||
tok = tok->tokAt(3);
|
|
||||||
//remove ']'
|
|
||||||
tok->str(")");
|
|
||||||
Token::createMutualLinks(tok->tokAt(-4), tok);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tokenizer::simplifyNestedStrcat()
|
void Tokenizer::simplifyNestedStrcat()
|
||||||
{
|
{
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
||||||
|
@ -9147,33 +9019,6 @@ void Tokenizer::simplifyNestedStrcat()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const std::set<std::string> stdFunctionsPresentInC = {
|
|
||||||
"strcat",
|
|
||||||
"strcpy",
|
|
||||||
"strncat",
|
|
||||||
"strncpy",
|
|
||||||
"free",
|
|
||||||
"malloc",
|
|
||||||
"strdup"
|
|
||||||
};
|
|
||||||
|
|
||||||
void Tokenizer::simplifyStd()
|
|
||||||
{
|
|
||||||
if (isC())
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
|
||||||
if (tok->str() != "std")
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (Token::Match(tok->previous(), "[(,{};] std :: %name% (") &&
|
|
||||||
stdFunctionsPresentInC.find(tok->strAt(2)) != stdFunctionsPresentInC.end()) {
|
|
||||||
tok->deleteNext();
|
|
||||||
tok->deleteThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Helper functions for handling the tokens list
|
// Helper functions for handling the tokens list
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -202,19 +202,6 @@ public:
|
||||||
*/
|
*/
|
||||||
bool simplifyCalculations();
|
bool simplifyCalculations();
|
||||||
|
|
||||||
/**
|
|
||||||
* Simplify dereferencing a pointer offset by a number:
|
|
||||||
* "*(ptr + num)" => "ptr[num]"
|
|
||||||
* "*(ptr - num)" => "ptr[-num]"
|
|
||||||
*/
|
|
||||||
void simplifyOffsetPointerDereference();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simplify referencing a pointer offset:
|
|
||||||
* "Replace "&str[num]" => "(str + num)"
|
|
||||||
*/
|
|
||||||
void simplifyOffsetPointerReference();
|
|
||||||
|
|
||||||
/** Insert array size where it isn't given */
|
/** Insert array size where it isn't given */
|
||||||
void arraySize();
|
void arraySize();
|
||||||
|
|
||||||
|
@ -458,9 +445,6 @@ public:
|
||||||
*/
|
*/
|
||||||
bool simplifyRedundantParentheses();
|
bool simplifyRedundantParentheses();
|
||||||
|
|
||||||
/** Simplify references */
|
|
||||||
void simplifyReference();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simplify functions like "void f(x) int x; {"
|
* Simplify functions like "void f(x) int x; {"
|
||||||
* into "void f(int x) {"
|
* into "void f(int x) {"
|
||||||
|
@ -557,11 +541,6 @@ private:
|
||||||
*/
|
*/
|
||||||
void simplifyFuncInWhile();
|
void simplifyFuncInWhile();
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove "std::" before some function names
|
|
||||||
*/
|
|
||||||
void simplifyStd();
|
|
||||||
|
|
||||||
/** Simplify pointer to standard type (C only) */
|
/** Simplify pointer to standard type (C only) */
|
||||||
void simplifyPointerToStandardType();
|
void simplifyPointerToStandardType();
|
||||||
|
|
||||||
|
|
|
@ -52,8 +52,6 @@ private:
|
||||||
settings_std.checkUnusedTemplates = true;
|
settings_std.checkUnusedTemplates = true;
|
||||||
settings_windows.checkUnusedTemplates = true;
|
settings_windows.checkUnusedTemplates = true;
|
||||||
|
|
||||||
TEST_CASE(test1); // array access. replace "*(p+1)" => "p[1]"
|
|
||||||
|
|
||||||
TEST_CASE(cast);
|
TEST_CASE(cast);
|
||||||
TEST_CASE(iftruefalse);
|
TEST_CASE(iftruefalse);
|
||||||
|
|
||||||
|
@ -162,12 +160,6 @@ private:
|
||||||
// ticket #3140
|
// ticket #3140
|
||||||
TEST_CASE(while0for);
|
TEST_CASE(while0for);
|
||||||
|
|
||||||
// remove "std::" on some standard functions
|
|
||||||
TEST_CASE(removestd);
|
|
||||||
|
|
||||||
// Tokenizer::simplifyReference
|
|
||||||
TEST_CASE(simplifyReference);
|
|
||||||
|
|
||||||
// x = realloc(y,0); => free(y);x=0;
|
// x = realloc(y,0); => free(y);x=0;
|
||||||
TEST_CASE(simplifyRealloc);
|
TEST_CASE(simplifyRealloc);
|
||||||
|
|
||||||
|
@ -212,7 +204,6 @@ private:
|
||||||
|
|
||||||
TEST_CASE(undefinedSizeArray);
|
TEST_CASE(undefinedSizeArray);
|
||||||
|
|
||||||
TEST_CASE(simplifyArrayAddress); // Replace "&str[num]" => "(str + num)"
|
|
||||||
TEST_CASE(simplifyOverride); // ticket #5069
|
TEST_CASE(simplifyOverride); // ticket #5069
|
||||||
TEST_CASE(simplifyNestedNamespace);
|
TEST_CASE(simplifyNestedNamespace);
|
||||||
TEST_CASE(simplifyNamespaceAliases1);
|
TEST_CASE(simplifyNamespaceAliases1);
|
||||||
|
@ -432,52 +423,6 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void test1() {
|
|
||||||
// "&p[1]" => "p+1"
|
|
||||||
/*
|
|
||||||
ASSERT_EQUALS("; x = p + n ;", tok("; x = & p [ n ] ;"));
|
|
||||||
ASSERT_EQUALS("; x = ( p + n ) [ m ] ;", tok("; x = & p [ n ] [ m ] ;"));
|
|
||||||
ASSERT_EQUALS("; x = y & p [ n ] ;", tok("; x = y & p [ n ] ;"));
|
|
||||||
ASSERT_EQUALS("; x = 10 & p [ n ] ;", tok("; x = 10 & p [ n ] ;"));
|
|
||||||
ASSERT_EQUALS("; x = y [ 10 ] & p [ n ] ;", tok("; x = y [ 10 ] & p [ n ] ;"));
|
|
||||||
ASSERT_EQUALS("; x = ( a + m ) & p [ n ] ;", tok("; x = ( a + m ) & p [ n ] ;"));
|
|
||||||
*/
|
|
||||||
// "*(p+1)" => "p[1]"
|
|
||||||
ASSERT_EQUALS("; x = p [ 1 ] ;", tok("; x = * ( p + 1 ) ;"));
|
|
||||||
ASSERT_EQUALS("; x = p [ 0xA ] ;", tok("; x = * ( p + 0xA ) ;"));
|
|
||||||
ASSERT_EQUALS("; x = p [ n ] ;", tok("; x = * ( p + n ) ;"));
|
|
||||||
ASSERT_EQUALS("; x = y * ( p + n ) ;", tok("; x = y * ( p + n ) ;"));
|
|
||||||
ASSERT_EQUALS("; x = 10 * ( p + n ) ;", tok("; x = 10 * ( p + n ) ;"));
|
|
||||||
ASSERT_EQUALS("; x = y [ 10 ] * ( p + n ) ;", tok("; x = y [ 10 ] * ( p + n ) ;"));
|
|
||||||
ASSERT_EQUALS("; x = ( a + m ) * ( p + n ) ;", tok("; x = ( a + m ) * ( p + n ) ;"));
|
|
||||||
|
|
||||||
// "*(p-1)" => "p[-1]" and "*(p-n)" => "p[-n]"
|
|
||||||
ASSERT_EQUALS("; x = p [ -1 ] ;", tok("; x = *(p - 1);"));
|
|
||||||
ASSERT_EQUALS("; x = p [ -0xA ] ;", tok("; x = *(p - 0xA);"));
|
|
||||||
ASSERT_EQUALS("; x = p [ - n ] ;", tok("; x = *(p - n);"));
|
|
||||||
ASSERT_EQUALS("; x = y * ( p - 1 ) ;", tok("; x = y * (p - 1);"));
|
|
||||||
ASSERT_EQUALS("; x = 10 * ( p - 1 ) ;", tok("; x = 10 * (p - 1);"));
|
|
||||||
ASSERT_EQUALS("; x = y [ 10 ] * ( p - 1 ) ;", tok("; x = y[10] * (p - 1);"));
|
|
||||||
ASSERT_EQUALS("; x = ( a - m ) * ( p - n ) ;", tok("; x = (a - m) * (p - n);"));
|
|
||||||
|
|
||||||
// Test that the array-index simplification is not applied when there's no dereference:
|
|
||||||
// "(x-y)" => "(x-y)" and "(x+y)" => "(x+y)"
|
|
||||||
ASSERT_EQUALS("; a = b * ( x - y ) ;", tok("; a = b * (x - y);"));
|
|
||||||
ASSERT_EQUALS("; a = b * x [ - y ] ;", tok("; a = b * *(x - y);"));
|
|
||||||
ASSERT_EQUALS("; a *= ( x - y ) ;", tok("; a *= (x - y);"));
|
|
||||||
ASSERT_EQUALS("; z = a ++ * ( x - y ) ;", tok("; z = a++ * (x - y);"));
|
|
||||||
ASSERT_EQUALS("; z = a ++ * ( x + y ) ;", tok("; z = a++ * (x + y);"));
|
|
||||||
ASSERT_EQUALS("; z = a -- * ( x - y ) ;", tok("; z = a-- * (x - y);"));
|
|
||||||
ASSERT_EQUALS("; z = a -- * ( x + y ) ;", tok("; z = a-- * (x + y);"));
|
|
||||||
ASSERT_EQUALS("; z = 'a' * ( x - y ) ;", tok("; z = 'a' * (x - y);"));
|
|
||||||
ASSERT_EQUALS("; z = \"a\" * ( x - y ) ;", tok("; z = \"a\" * (x - y);"));
|
|
||||||
ASSERT_EQUALS("; z = 'a' * ( x + y ) ;", tok("; z = 'a' * (x + y);"));
|
|
||||||
ASSERT_EQUALS("; z = \"a\" * ( x + y ) ;", tok("; z = \"a\" * (x + y);"));
|
|
||||||
ASSERT_EQUALS("; z = foo ( ) * ( x + y ) ;", tok("; z = foo() * (x + y);"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void simplifyMathFunctions_erfc() {
|
void simplifyMathFunctions_erfc() {
|
||||||
// verify erfc(), erfcf(), erfcl() - simplifcation
|
// verify erfc(), erfcf(), erfcl() - simplifcation
|
||||||
const char code_erfc[] ="void f(int x) {\n"
|
const char code_erfc[] ="void f(int x) {\n"
|
||||||
|
@ -4194,25 +4139,6 @@ private:
|
||||||
ASSERT_EQUALS("void f ( ) { int i ; for ( i = 0 ; i < 0 ; ++ i ) { } return i ; }", tok("void f() { int i; for (i=0;i<0;++i){ dostuff(); } return i; }"));
|
ASSERT_EQUALS("void f ( ) { int i ; for ( i = 0 ; i < 0 ; ++ i ) { } return i ; }", tok("void f() { int i; for (i=0;i<0;++i){ dostuff(); } return i; }"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void removestd() {
|
|
||||||
ASSERT_EQUALS("; strcpy ( a , b ) ;", tok("; std::strcpy(a,b);"));
|
|
||||||
ASSERT_EQUALS("; strcat ( a , b ) ;", tok("; std::strcat(a,b);"));
|
|
||||||
ASSERT_EQUALS("; strncpy ( a , b , 10 ) ;", tok("; std::strncpy(a,b,10);"));
|
|
||||||
ASSERT_EQUALS("; strncat ( a , b , 10 ) ;", tok("; std::strncat(a,b,10);"));
|
|
||||||
ASSERT_EQUALS("; free ( p ) ;", tok("; std::free(p);"));
|
|
||||||
ASSERT_EQUALS("; malloc ( 10 ) ;", tok("; std::malloc(10);"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void simplifyReference() {
|
|
||||||
ASSERT_EQUALS("void f ( ) { int a ; a ++ ; }",
|
|
||||||
tok("void f() { int a; int &b(a); b++; }"));
|
|
||||||
ASSERT_EQUALS("void f ( ) { int a ; a ++ ; }",
|
|
||||||
tok("void f() { int a; int &b = a; b++; }"));
|
|
||||||
|
|
||||||
ASSERT_EQUALS("void test ( ) { c . f ( 7 ) ; }",
|
|
||||||
tok("void test() { c.f(7); T3 &t3 = c; }")); // #6133
|
|
||||||
}
|
|
||||||
|
|
||||||
void simplifyRealloc() {
|
void simplifyRealloc() {
|
||||||
ASSERT_EQUALS("; free ( p ) ; p = 0 ;", tok("; p = realloc(p, 0);"));
|
ASSERT_EQUALS("; free ( p ) ; p = 0 ;", tok("; p = realloc(p, 0);"));
|
||||||
ASSERT_EQUALS("; p = malloc ( 100 ) ;", tok("; p = realloc(0, 100);"));
|
ASSERT_EQUALS("; p = malloc ( 100 ) ;", tok("; p = realloc(0, 100);"));
|
||||||
|
@ -4838,17 +4764,6 @@ private:
|
||||||
ASSERT_EQUALS("int x [ 13 ] = { [ 11 ] = 2 , [ 12 ] = 3 } ;", tok("int x[] = {[11]=2, [12]=3};"));
|
ASSERT_EQUALS("int x [ 13 ] = { [ 11 ] = 2 , [ 12 ] = 3 } ;", tok("int x[] = {[11]=2, [12]=3};"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void simplifyArrayAddress() { // ticket #3304
|
|
||||||
const char code[] = "void foo() {\n"
|
|
||||||
" int a[10];\n"
|
|
||||||
" memset(&a[4], 0, 20*sizeof(int));\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS("void foo ( ) {"
|
|
||||||
" int a [ 10 ] ;"
|
|
||||||
" memset ( a + 4 , 0 , 80 ) ;"
|
|
||||||
" }", tok(code, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_4881() {
|
void test_4881() {
|
||||||
const char code[] = "int evallex() {\n"
|
const char code[] = "int evallex() {\n"
|
||||||
" int c, t;\n"
|
" int c, t;\n"
|
||||||
|
|
Loading…
Reference in New Issue