MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / checkBufferSize

Function checkBufferSize

lib/checkbufferoverrun.cpp:591–634  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

589//---------------------------------------------------------------------------
590
591static bool checkBufferSize(const Token *ftok, const Library::ArgumentChecks::MinSize &minsize, const std::vector<const Token *> &args, const MathLib::bigint bufferSize, const Settings &settings, const Tokenizer* tokenizer)
592{
593 const Token * const arg = (minsize.arg > 0 && minsize.arg - 1 < args.size()) ? args[minsize.arg - 1] : nullptr;
594 const Token * const arg2 = (minsize.arg2 > 0 && minsize.arg2 - 1 < args.size()) ? args[minsize.arg2 - 1] : nullptr;
595
596 switch (minsize.type) {
597 case Library::ArgumentChecks::MinSize::Type::STRLEN:
598 if (settings.library.isargformatstr(ftok, minsize.arg)) {
599 return getMinFormatStringOutputLength(args, minsize.arg, settings) < bufferSize;
600 } else if (arg) {
601 const Token *strtoken = arg->getValueTokenMaxStrLength();
602 if (strtoken)
603 return Token::getStrLength(strtoken) < bufferSize;
604 }
605 break;
606 case Library::ArgumentChecks::MinSize::Type::ARGVALUE: {
607 if (arg && arg->hasKnownIntValue()) {
608 MathLib::bigint myMinsize = arg->getKnownIntValue();
609 const int baseSize = tokenizer->sizeOfType(minsize.baseType);
610 if (baseSize != 0)
611 myMinsize *= baseSize;
612 return myMinsize <= bufferSize;
613 }
614 break;
615 }
616 case Library::ArgumentChecks::MinSize::Type::SIZEOF:
617 // TODO
618 break;
619 case Library::ArgumentChecks::MinSize::Type::MUL:
620 if (arg && arg2 && arg->hasKnownIntValue() && arg2->hasKnownIntValue())
621 return (arg->getKnownIntValue() * arg2->getKnownIntValue()) <= bufferSize;
622 break;
623 case Library::ArgumentChecks::MinSize::Type::VALUE: {
624 MathLib::bigint myMinsize = minsize.value;
625 const int baseSize = tokenizer->sizeOfType(minsize.baseType);
626 if (baseSize != 0)
627 myMinsize *= baseSize;
628 return myMinsize <= bufferSize;
629 }
630 case Library::ArgumentChecks::MinSize::Type::NONE:
631 break;
632 }
633 return true;
634}
635
636
637void CheckBufferOverrunImpl::bufferOverflow()

Callers 1

bufferOverflowMethod · 0.85

Calls 6

getKnownIntValueMethod · 0.80
sizeMethod · 0.45
hasKnownIntValueMethod · 0.45
sizeOfTypeMethod · 0.45

Tested by

no test coverage detected