Skip to content

Commit

Permalink
begin checking memcpy/memmove in checkleakautovar
Browse files Browse the repository at this point in the history
  • Loading branch information
ludviggunne committed Sep 10, 2024
1 parent 4cf5cc2 commit 22f7c0a
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions lib/checkleakautovar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,34 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken,
while (Token::Match(ftok, "%name% :: %name%"))
ftok = ftok->tokAt(2);

// memcpy / memmove
if (Token::Match(varTok, "memcpy|memmove")) {
const std::vector<const Token*> args = getArguments(varTok);
// too few args for memcpy / memmove call
if (args.size() < 3)
continue;
const Token *dst = args[0];
const Token *src = args[1];

// check that arguments are pointers
bool dstIsPtr = dst->isVariable() && dst->variable()->isPointer();
if (!dstIsPtr && dst->str() == "&") {
dst = dst->astOperand1();
dstIsPtr = true;
}
bool srcIsPtr = src->isVariable() && src->variable()->isPointer();
if (!srcIsPtr && src->str() == "&") {
src = src->astOperand1();
srcIsPtr = true;
}
if (!dstIsPtr || !srcIsPtr) {
continue;
}

// TODO: check that dst and src are pointers to pointers
// TODO: move ownership from src to dst
}

auto isAssignment = [](const Token* varTok) -> const Token* {
if (varTok->varId()) {
const Token* top = varTok;
Expand Down

0 comments on commit 22f7c0a

Please sign in to comment.