@@ -54,8 +54,8 @@ static const Token * skipBrackets(const Token *tok)
5454class UninitVar : public ExecutionPath {
5555public:
5656 /* * Startup constructor */
57- explicit UninitVar (Check *c, const SymbolDatabase* db, bool isc)
58- : ExecutionPath(c, 0 ), symbolDatabase(db), isC(isc), var(0 ), alloc(false ), strncpy_(false ), memset_nonzero(false ) {
57+ explicit UninitVar (Check *c, const SymbolDatabase* db, const Library *lib, bool isc)
58+ : ExecutionPath(c, 0 ), symbolDatabase(db), library(lib), isC(isc), var(0 ), alloc(false ), strncpy_(false ), memset_nonzero(false ) {
5959 }
6060
6161private:
@@ -68,8 +68,8 @@ class UninitVar : public ExecutionPath {
6868 void operator =(const UninitVar &);
6969
7070 /* * internal constructor for creating extra checks */
71- UninitVar (Check *c, const Variable* v, const SymbolDatabase* db, bool isc)
72- : ExecutionPath(c, v->varId ()), symbolDatabase(db), isC(isc), var(v), alloc(false ), strncpy_(false ), memset_nonzero(false ) {
71+ UninitVar (Check *c, const Variable* v, const SymbolDatabase* db, const Library *lib, bool isc)
72+ : ExecutionPath(c, v->varId ()), symbolDatabase(db), library(lib), isC(isc), var(v), alloc(false ), strncpy_(false ), memset_nonzero(false ) {
7373 }
7474
7575 /* * is other execution path equal? */
@@ -81,6 +81,9 @@ class UninitVar : public ExecutionPath {
8181 /* * pointer to symbol database */
8282 const SymbolDatabase* symbolDatabase;
8383
84+ /* * pointer to library */
85+ const Library *library;
86+
8487 const bool isC;
8588
8689 /* * variable for this check */
@@ -425,7 +428,7 @@ class UninitVar : public ExecutionPath {
425428 }
426429
427430 if (var2->isPointer ())
428- checks.push_back (new UninitVar (owner, var2, symbolDatabase, isC));
431+ checks.push_back (new UninitVar (owner, var2, symbolDatabase, library, isC));
429432 else if (var2->typeEndToken ()->str () != " >" ) {
430433 bool stdtype = false ; // TODO: change to isC to handle unknown types better
431434 for (const Token* tok2 = var2->typeStartToken (); tok2 != var2->nameToken (); tok2 = tok2->next ()) {
@@ -435,7 +438,7 @@ class UninitVar : public ExecutionPath {
435438 }
436439 }
437440 if (stdtype && (!var2->isArray () || var2->nameToken ()->linkAt (1 )->strAt (1 ) == " ;" ))
438- checks.push_back (new UninitVar (owner, var2, symbolDatabase, isC));
441+ checks.push_back (new UninitVar (owner, var2, symbolDatabase, library, isC));
439442 }
440443 return &tok;
441444 }
@@ -573,7 +576,8 @@ class UninitVar : public ExecutionPath {
573576 return &tok;
574577 }
575578
576- if (Token::Match (tok.next (), " = malloc|kmalloc" ) || Token::simpleMatch (tok.next (), " = new char [" )) {
579+ if (Token::Match (tok.next (), " = malloc|kmalloc" ) || Token::simpleMatch (tok.next (), " = new char [" ) ||
580+ (Token::Match (tok.next (), " = %var% (" ) && library->returnuninitdata .find (tok.strAt (2 )) != library->returnuninitdata .end ())) {
577581 alloc_pointer (checks, tok.varId ());
578582 if (tok.strAt (3 ) == " (" )
579583 return tok.tokAt (3 );
@@ -1037,7 +1041,7 @@ void CheckUninitVar::executionPaths()
10371041 if (_settings->_jobs == 1 )
10381042 UninitVar::analyseFunctions (_tokenizer->tokens (), UninitVar::uvarFunctions);
10391043
1040- UninitVar c (this , _tokenizer->getSymbolDatabase (), _tokenizer->isC ());
1044+ UninitVar c (this , _tokenizer->getSymbolDatabase (), &_settings-> library , _tokenizer->isC ());
10411045 checkExecutionPaths (_tokenizer->getSymbolDatabase (), &c);
10421046 }
10431047}
0 commit comments