| 589 | //--------------------------------------------------------------------------- |
| 590 | |
| 591 | static 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 | |
| 637 | void CheckBufferOverrunImpl::bufferOverflow() |
no test coverage detected