================ @@ -2223,16 +2223,81 @@ void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallEvent &Call, Result = lastElement; } + // For bounded method, amountCopied take the minimum of two values, + // for ConcatFnKind::strlcat: + // amountCopied = min (size - dstLen - 1 , srcLen) + // for others: + // amountCopied = min (srcLen, size) + // So even if we don't know about amountCopied, as long as one of them will + // not cause an out-of-bound access, the whole function's operation will not + // too, that will avoid invalidating the superRegion of data member in that + // situation. + bool CouldAccessOutOfBound = true; + if (IsBounded && amountCopied.isUnknown()) { + // Get the max number of characters to copy. + SizeArgExpr lenExpr = {{Call.getArgExpr(2), 2}}; + SVal lenVal = state->getSVal(lenExpr.Expression, LCtx); + + // Protect against misdeclared strncpy(). + lenVal = + svalBuilder.evalCast(lenVal, sizeTy, lenExpr.Expression->getType()); + + std::optional<NonLoc> lenValNL = lenVal.getAs<NonLoc>(); + + auto CouldAccessOutOfBoundForSVal = [&](NonLoc Val) -> bool { + return !isFirstBufInBound(C, state, C.getSVal(Dst.Expression), + Dst.Expression->getType(), Val, + C.getASTContext().getSizeType()); + }; + + if (strLengthNL) { + CouldAccessOutOfBound = CouldAccessOutOfBoundForSVal(*strLengthNL); + } + + if (CouldAccessOutOfBound && lenValNL) { + switch (appendK) { + case ConcatFnKind::none: + case ConcatFnKind::strcat: { + CouldAccessOutOfBound = CouldAccessOutOfBoundForSVal(*lenValNL); + break; + } + case ConcatFnKind::strlcat: { ---------------- flovent wrote:
I think that make sense, now it use `size` for all `ConcatFnKind`'s check. https://github.com/llvm/llvm-project/pull/146212 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits