Cppcheck
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Static Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
UninitVar Class Reference

Check that uninitialized variables aren't used (using ExecutionPath) More...

Inheritance diagram for UninitVar:
ExecutionPath

Static Public Member Functions

 UninitVar (Check *c, const SymbolDatabase *db, const Library *lib, bool isc)
 Startup constructor.
static void analyseFunctions (const Token *const tokens, std::set< std::string > &func)
- Static Public Member Functions inherited from ExecutionPath
static void bailOut (std::list< ExecutionPath * > &checks)
 bail out all execution paths
static void bailOutVar (std::list< ExecutionPath * > &checks, const unsigned int varid)
 bail out execution paths with given variable id
static void checkScope (const Token *tok, std::list< ExecutionPath * > &checks)

Private Member Functions

ExecutionPathcopy ()
 Create a copy of this check.
 UninitVar (Check *c, const Variable *v, const SymbolDatabase *db, const Library *lib, bool isc)
 internal constructor for creating extra checks
bool is_equal (const ExecutionPath *e) const
 is other execution path equal?
const Tokenparse (const Token &tok, std::list< ExecutionPath * > &checks) const
 parse tokens.
bool parseCondition (const Token &tok, std::list< ExecutionPath * > &checks)
void parseLoopBody (const Token *tok, std::list< ExecutionPath * > &checks) const

Static Private Member Functions

static void alloc_pointer (std::list< ExecutionPath * > &checks, unsigned int varid)
 allocating pointer.
static void init_pointer (std::list< ExecutionPath * > &checks, const Token *tok)
 Initializing a pointer value.
static void dealloc_pointer (std::list< ExecutionPath * > &checks, const Token *tok)
 Deallocate a pointer.
static void pointer_assignment (std::list< ExecutionPath * > &checks, const Token *tok1, const Token *tok2)
 Pointer assignment: p = x; if p is a pointer and x is an array/pointer then bail out.
static void init_strncpy (std::list< ExecutionPath * > &checks, const Token *tok)
 Initialize an array with strncpy.
static void init_memset_nonzero (std::list< ExecutionPath * > &checks, const Token *tok)
 Initialize an array with memset (not zero).
static bool use (std::list< ExecutionPath * > &checks, const Token *tok, const int mode)
 use - called from the use* functions below.
static bool use (std::list< ExecutionPath * > &checks, const Token *tok)
 Reading variable.
static void use_array (std::list< ExecutionPath * > &checks, const Token *tok)
 Reading array elements.
static void use_array_mem (std::list< ExecutionPath * > &checks, const Token *tok)
 Reading array elements with a "mem.." function.
static bool use_pointer (std::list< ExecutionPath * > &checks, const Token *tok)
 Bad pointer usage.
static bool use_dead_pointer (std::list< ExecutionPath * > &checks, const Token *tok)
 Using variable.
static bool use_array_or_pointer_data (std::list< ExecutionPath * > &checks, const Token *tok)
 Using variable.
static void parserhs (const Token *tok2, std::list< ExecutionPath * > &checks)
 Parse right hand side expression in statement.

Private Attributes

const SymbolDatabasesymbolDatabase
 pointer to symbol database
const Librarylibrary
 pointer to library
const bool isC
const Variablevar
 variable for this check
bool alloc
 is this variable allocated?
bool strncpy_
 is this variable initialized with strncpy (not always zero-terminated)
bool memset_nonzero
 is this variable initialized but not zero-terminated (memset)

Additional Inherited Members

- Public Member Functions inherited from ExecutionPath
 ExecutionPath (Check *c, unsigned int id)
virtual ~ExecutionPath ()
virtual ExecutionPathcopy ()=0
 Implement this in each derived class.
void print () const
 print checkdata
virtual const Tokenparse (const Token &tok, std::list< ExecutionPath * > &checks) const =0
 Parse tokens at given location.
virtual bool parseCondition (const Token &tok, std::list< ExecutionPath * > &checks)
 Parse condition.
virtual void parseLoopBody (const Token *tok, std::list< ExecutionPath * > &checks) const
 Parse loop body.
virtual void end (const std::list< ExecutionPath * > &, const Token *) const
 going out of scope - all execution paths end
bool operator== (const ExecutionPath &e) const
- Public Attributes inherited from ExecutionPath
unsigned int numberOfIf
 number of if blocks
const unsigned int varId
- Protected Member Functions inherited from ExecutionPath
virtual bool is_equal (const ExecutionPath *) const =0
 Are two execution paths equal?
- Protected Attributes inherited from ExecutionPath
Check *const owner

Detailed Description

Check that uninitialized variables aren't used (using ExecutionPath)

Definition at line 55 of file checkuninitvar.cpp.

Constructor & Destructor Documentation

UninitVar::UninitVar ( Check c,
const SymbolDatabase db,
const Library lib,
bool  isc 
)
inlineexplicitstatic

Startup constructor.

Definition at line 58 of file checkuninitvar.cpp.

Referenced by copy(), and parse().

UninitVar::UninitVar ( Check c,
const Variable v,
const SymbolDatabase db,
const Library lib,
bool  isc 
)
inlineprivate

internal constructor for creating extra checks

Definition at line 69 of file checkuninitvar.cpp.

Member Function Documentation

static void UninitVar::alloc_pointer ( std::list< ExecutionPath * > &  checks,
unsigned int  varid 
)
inlinestaticprivate

allocating pointer.

For example : p = malloc(10);

Definition at line 100 of file checkuninitvar.cpp.

References alloc, ExecutionPath::bailOutVar(), Variable::isArray(), Variable::isPointer(), var, and ExecutionPath::varId.

Referenced by parse().

static void UninitVar::analyseFunctions ( const Token *const  tokens,
std::set< std::string > &  func 
)
inlinestatic
Todo:
enable this code. if pointer is written in function then dead pointer is invalid but valid pointer is ok.

Definition at line 923 of file checkuninitvar.cpp.

References Token::eIncDecOp, Token::isName(), Token::isStandardType(), Token::link(), Token::Match(), Token::next(), Token::str(), Token::tokAt(), and Token::varId().

ExecutionPath* UninitVar::copy ( )
inlineprivate

Create a copy of this check.

Definition at line 64 of file checkuninitvar.cpp.

References UninitVar().

static void UninitVar::dealloc_pointer ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Deallocate a pointer.

For example: free(p);

Definition at line 142 of file checkuninitvar.cpp.

References alloc, Variable::isArray(), Variable::isPointer(), Variable::name(), ExecutionPath::owner, CheckUninitVar::uninitvarError(), var, ExecutionPath::varId, and Token::varId().

Referenced by parse().

static void UninitVar::init_memset_nonzero ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Initialize an array with memset (not zero).

Definition at line 222 of file checkuninitvar.cpp.

References memset_nonzero, ExecutionPath::varId, and Token::varId().

Referenced by parse().

static void UninitVar::init_pointer ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Initializing a pointer value.

For example: *p = 0;

Definition at line 117 of file checkuninitvar.cpp.

References alloc, Variable::isArray(), use_pointer(), var, ExecutionPath::varId, and Token::varId().

Referenced by parse().

static void UninitVar::init_strncpy ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Initialize an array with strncpy.

Definition at line 207 of file checkuninitvar.cpp.

References strncpy_, ExecutionPath::varId, and Token::varId().

Referenced by parse().

bool UninitVar::is_equal ( const ExecutionPath e) const
inlineprivate

is other execution path equal?

Definition at line 74 of file checkuninitvar.cpp.

References alloc, memset_nonzero, strncpy_, and var.

const Token* UninitVar::parse ( const Token tok,
std::list< ExecutionPath * > &  checks 
) const
inlineprivate
bool UninitVar::parseCondition ( const Token tok,
std::list< ExecutionPath * > &  checks 
)
inlineprivate
void UninitVar::parseLoopBody ( const Token tok,
std::list< ExecutionPath * > &  checks 
) const
inlineprivate
static void UninitVar::parserhs ( const Token tok2,
std::list< ExecutionPath * > &  checks 
)
inlinestaticprivate

Parse right hand side expression in statement.

Parameters
tok2start token of rhs
checksthe execution paths

Definition at line 367 of file checkuninitvar.cpp.

References ExecutionPath::bailOutVar(), Token::link(), Token::linkAt(), Token::Match(), Token::next(), Token::previous(), Token::simpleMatch(), Token::str(), Token::strAt(), Token::tokAt(), use(), use_array_or_pointer_data(), and Token::varId().

Referenced by parse().

static void UninitVar::pointer_assignment ( std::list< ExecutionPath * > &  checks,
const Token tok1,
const Token tok2 
)
inlinestaticprivate

Pointer assignment: p = x; if p is a pointer and x is an array/pointer then bail out.

Parameters
checksall available checks
tok1the "p" token
tok2the "x" token

Definition at line 173 of file checkuninitvar.cpp.

References ExecutionPath::bailOutVar(), Variable::isArray(), Variable::isPointer(), var, ExecutionPath::varId, and Token::varId().

Referenced by parse().

static bool UninitVar::use ( std::list< ExecutionPath * > &  checks,
const Token tok,
const int  mode 
)
inlinestaticprivate
static bool UninitVar::use ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Reading variable.

Use this function in situations when it is invalid to read the data of the variable but not the address.

Parameters
checksall available checks
tokvariable token
Returns
if error is found, true is returned

Definition at line 309 of file checkuninitvar.cpp.

References use().

static void UninitVar::use_array ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Reading array elements.

If the variable is not an array then the usage is ok.

Parameters
checksall available checks
tokvariable token

Definition at line 318 of file checkuninitvar.cpp.

References use().

Referenced by parse(), and parseCondition().

static void UninitVar::use_array_mem ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Reading array elements with a "mem.." function.

It's ok if the array is not null-terminated.

Parameters
checksall available checks
tokvariable token

Definition at line 327 of file checkuninitvar.cpp.

References use().

Referenced by parse(), and parseCondition().

static bool UninitVar::use_array_or_pointer_data ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Using variable.

. reading from uninitialized array or pointer data is invalid. Example: = x[0];

Parameters
checksall available checks
tokvariable token
Returns
if error is found, true is returned

Definition at line 358 of file checkuninitvar.cpp.

References use().

Referenced by parse(), parseCondition(), and parserhs().

static bool UninitVar::use_dead_pointer ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Using variable.

. if it's a dead pointer the usage is invalid.

Parameters
checksall available checks
tokvariable token
Returns
if error is found, true is returned

Definition at line 347 of file checkuninitvar.cpp.

References use().

Referenced by parse().

static bool UninitVar::use_pointer ( std::list< ExecutionPath * > &  checks,
const Token tok 
)
inlinestaticprivate

Bad pointer usage.

If the variable is not a pointer then the usage is ok.

Parameters
checksall available checks
tokvariable token
Returns
if error is found, true is returned

Definition at line 337 of file checkuninitvar.cpp.

References use().

Referenced by init_pointer(), and parse().

Member Data Documentation

bool UninitVar::alloc
private

is this variable allocated?

Definition at line 91 of file checkuninitvar.cpp.

Referenced by alloc_pointer(), dealloc_pointer(), init_pointer(), is_equal(), parse(), and use().

const bool UninitVar::isC
private

Definition at line 85 of file checkuninitvar.cpp.

Referenced by parse().

const Library* UninitVar::library
private

pointer to library

Definition at line 83 of file checkuninitvar.cpp.

Referenced by parse(), and parseCondition().

bool UninitVar::memset_nonzero
private

is this variable initialized but not zero-terminated (memset)

Definition at line 97 of file checkuninitvar.cpp.

Referenced by init_memset_nonzero(), is_equal(), and use().

bool UninitVar::strncpy_
private

is this variable initialized with strncpy (not always zero-terminated)

Definition at line 94 of file checkuninitvar.cpp.

Referenced by init_strncpy(), is_equal(), and use().

const SymbolDatabase* UninitVar::symbolDatabase
private

pointer to symbol database

Definition at line 80 of file checkuninitvar.cpp.

Referenced by parse().

const Variable* UninitVar::var
private

variable for this check

Definition at line 88 of file checkuninitvar.cpp.

Referenced by alloc_pointer(), dealloc_pointer(), init_pointer(), is_equal(), parse(), pointer_assignment(), and use().


The documentation for this class was generated from the following file: