Function list: Remove functions with duplicate names to prevent false positives
This commit is contained in:
parent
2e445b195c
commit
63bc26d662
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* c++check - c/c++ syntax checking
|
* c++check - c/c++ syntax checking
|
||||||
* Copyright (C) 2007 Daniel Marjamäki
|
* Copyright (C) 2007 Daniel Marjamäki
|
||||||
*
|
*
|
||||||
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "testsuite.h"
|
#include "testsuite.h"
|
||||||
|
#define UNIT_TESTING // Get access to "private" data in Tokenizer
|
||||||
#include "tokenize.h"
|
#include "tokenize.h"
|
||||||
|
|
||||||
class TestTokenizer : public TestFixture
|
class TestTokenizer : public TestFixture
|
||||||
|
@ -38,6 +39,8 @@ private:
|
||||||
TEST_CASE( longtok );
|
TEST_CASE( longtok );
|
||||||
|
|
||||||
TEST_CASE( inlineasm );
|
TEST_CASE( inlineasm );
|
||||||
|
|
||||||
|
TEST_CASE( dupfuncname );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,6 +134,27 @@ private:
|
||||||
|
|
||||||
tokenizer.DeallocateTokens();
|
tokenizer.DeallocateTokens();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dupfuncname()
|
||||||
|
{
|
||||||
|
const char code[] = "void a()\n"
|
||||||
|
"{ }\n"
|
||||||
|
"void a(int i)\n"
|
||||||
|
"{ }\n"
|
||||||
|
"void b()\n"
|
||||||
|
"{ }\n";
|
||||||
|
// tokenize..
|
||||||
|
Tokenizer tokenizer;
|
||||||
|
tokenizer.getFiles()->push_back( "test.cpp" );
|
||||||
|
std::istringstream istr(code);
|
||||||
|
tokenizer.TokenizeCode(istr, 0);
|
||||||
|
|
||||||
|
tokenizer.FillFunctionList(0);
|
||||||
|
|
||||||
|
ASSERT_EQUALS( 1, tokenizer.FunctionList.size() );
|
||||||
|
ASSERT_EQUALS( std::string("b"), tokenizer.FunctionList[0]->str );
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST( TestTokenizer )
|
REGISTER_TEST( TestTokenizer )
|
||||||
|
|
38
tokenize.cpp
38
tokenize.cpp
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* c++check - c/c++ syntax checking
|
* c++check - c/c++ syntax checking
|
||||||
* Copyright (C) 2007 Daniel Marjamäki
|
* Copyright (C) 2007 Daniel Marjamäki
|
||||||
*
|
*
|
||||||
|
@ -1120,12 +1120,11 @@ void Tokenizer::DeallocateTokens()
|
||||||
|
|
||||||
const TOKEN *Tokenizer::GetFunctionTokenByName( const char funcname[] ) const
|
const TOKEN *Tokenizer::GetFunctionTokenByName( const char funcname[] ) const
|
||||||
{
|
{
|
||||||
std::list<const TOKEN *>::const_iterator it;
|
for ( unsigned int i = 0; i < FunctionList.size(); ++i )
|
||||||
for ( it = FunctionList.begin(); it != FunctionList.end(); it++ )
|
|
||||||
{
|
{
|
||||||
if ( strcmp( (*it)->str, funcname ) == 0 )
|
if ( strcmp( FunctionList[i]->str, funcname ) == 0 )
|
||||||
{
|
{
|
||||||
return *it;
|
return FunctionList[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1220,6 +1219,35 @@ void Tokenizer::FillFunctionList(const unsigned int file_id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the FunctionList functions with duplicate names, remove them
|
||||||
|
// TODO this will need some better handling
|
||||||
|
for ( unsigned int func1 = 0; func1 < FunctionList.size(); )
|
||||||
|
{
|
||||||
|
bool hasDuplicates = false;
|
||||||
|
for ( unsigned int func2 = func1 + 1; func2 < FunctionList.size(); )
|
||||||
|
{
|
||||||
|
if ( strcmp(FunctionList[func1]->str, FunctionList[func2]->str) == 0 )
|
||||||
|
{
|
||||||
|
hasDuplicates = true;
|
||||||
|
FunctionList.erase( FunctionList.begin() + func2 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++func2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! hasDuplicates )
|
||||||
|
{
|
||||||
|
++func1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FunctionList.erase( FunctionList.begin() + func1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
for (std::list<const char *>::const_iterator it = _usedfunc.begin(); it != _usedfunc.end(); ++it)
|
for (std::list<const char *>::const_iterator it = _usedfunc.begin(); it != _usedfunc.end(); ++it)
|
||||||
{
|
{
|
||||||
if ( *it != 0 )
|
if ( *it != 0 )
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* c++check - c/c++ syntax checking
|
* c++check - c/c++ syntax checking
|
||||||
* Copyright (C) 2007 Daniel Marjamäki
|
* Copyright (C) 2007 Daniel Marjamäki
|
||||||
*
|
*
|
||||||
|
@ -95,7 +95,11 @@ public:
|
||||||
void CheckGlobalFunctionUsage(const std::vector<std::string> &filenames);
|
void CheckGlobalFunctionUsage(const std::vector<std::string> &filenames);
|
||||||
void settings( const Settings &settings );
|
void settings( const Settings &settings );
|
||||||
const TOKEN *tokens() const;
|
const TOKEN *tokens() const;
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef UNIT_TESTING
|
||||||
private:
|
private:
|
||||||
|
#endif
|
||||||
|
|
||||||
struct DefineSymbol
|
struct DefineSymbol
|
||||||
{
|
{
|
||||||
|
@ -135,7 +139,7 @@ private:
|
||||||
|
|
||||||
TOKEN *tokens_back;
|
TOKEN *tokens_back;
|
||||||
std::map<std::string, unsigned int> TypeSize;
|
std::map<std::string, unsigned int> TypeSize;
|
||||||
std::list<const TOKEN *> FunctionList;
|
std::vector<const TOKEN *> FunctionList;
|
||||||
std::list< GlobalFunction > GlobalFunctions;
|
std::list< GlobalFunction > GlobalFunctions;
|
||||||
std::list< GlobalFunction > UsedGlobalFunctions;
|
std::list< GlobalFunction > UsedGlobalFunctions;
|
||||||
std::vector<std::string> Files;
|
std::vector<std::string> Files;
|
||||||
|
|
Loading…
Reference in New Issue