================ @@ -2524,8 +2625,33 @@ void CStringChecker::evalStdCopyCommon(CheckerContext &C, C.addTransition(State); } -void CStringChecker::evalMemset(CheckerContext &C, - const CallEvent &Call) const { +namespace { +CharUnits getSizeOfUnit(CharKind CK, CheckerContext &C) { + assert(CK == CK_Regular || CK == CK_Wide); + auto UnitType = + CK == CK_Regular ? C.getASTContext().CharTy : C.getASTContext().WCharTy; + + return C.getASTContext().getTypeSizeInChars(UnitType); +} + +SVal getCharValCast(CharKind CK, CheckerContext &C, ProgramStateRef State, + const Expr *CharE) { + const LocationContext *LCtx = C.getLocationContext(); + auto CharVal = State->getSVal(CharE, LCtx); + if (CK == CK_Regular) { + auto &svalBuilder = C.getSValBuilder(); + const auto &Ctx = C.getASTContext(); + // With the semantic of 'memset()', we should convert the CharVal to + // unsigned char. + return svalBuilder.evalCast(CharVal, Ctx.UnsignedCharTy, Ctx.IntTy); + } + return CharVal; +} + +} // namespace ---------------- steakhal wrote:
```suggestion ``` https://github.com/llvm/llvm-project/pull/113908 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits