partial fix for #3050 (strncpy zero termination check behaving flaky)

This commit is contained in:
Robert Reif 2011-08-25 23:48:32 -04:00
parent 1d7ab77251
commit 9539d22a1a
1 changed files with 4 additions and 2 deletions

View File

@ -1162,10 +1162,12 @@ void CheckBufferOverrun::checkScope(const Token *tok, const ArrayInfo &arrayInfo
if (_settings->isEnabled("style")) if (_settings->isEnabled("style"))
{ {
// check for strncpy which is not terminated // check for strncpy which is not terminated
if ((Token::Match(tok, "strncpy ( %varid% , %var% , %num% )", arrayInfo.varid()))) if ((Token::Match(tok, "strncpy ( %varid% , %var% , %num% )", arrayInfo.varid())) ||
(Token::Match(tok, "strncpy ( %varid% , %var% [ %any% ] , %num% )", arrayInfo.varid())))
{ {
// strncpy takes entire variable length as input size // strncpy takes entire variable length as input size
if ((unsigned int)MathLib::toLongNumber(tok->strAt(6)) >= total_size) const int offset = tok->strAt(5) == "[" ? 9 : 6;
if ((unsigned int)MathLib::toLongNumber(tok->strAt(offset)) >= total_size)
{ {
const Token *tok2 = tok->next()->link()->next(); const Token *tok2 = tok->next()->link()->next();
for (; tok2; tok2 = tok2->next()) for (; tok2; tok2 = tok2->next())