Static Value-Flow Analysis
Loading...
Searching...
No Matches
AETest Class Reference

Public Member Functions

 AETest ()=default
 ~AETest ()=default
void testBinaryOpStmt ()
void testAbsState ()

Detailed Description

Definition at line 626 of file ae.cpp.

Constructor & Destructor Documentation

◆ AETest()

AETest::AETest ( )
default

◆ ~AETest()

AETest::~AETest ( )
default

Member Function Documentation

◆ testAbsState()

void AETest::testAbsState ( )
inline

Definition at line 834 of file ae.cpp.

835 {
836 AbstractState as;
837 as[1] = IntervalValue(1, 3);
838 as[2] = IntervalValue(2, 7);
839 as[3] = AddressValue(0x7f000007);
840 as[4] = AddressValue(0x7f000008);
841 // store: *as[3] = as[1], *as[4] = as[2]
842 for (auto addr : as[3].getAddrs()) as.store(addr, as[1]);
843 for (auto addr : as[4].getAddrs()) as.store(addr, as[2]);
845 // load: verify *as[3] == as[1] && *as[4] == as[2]
846 AbstractValue v3, v4;
847 for (auto addr : as[3].getAddrs()) v3.join_with(as.load(addr));
848 for (auto addr : as[4].getAddrs()) v4.join_with(as.load(addr));
849 assert(v3.equals(as[1]) && v4.equals(as[2]));
850 }
void store(u32_t addr, const AbstractValue &val)
void printAbstractState() const
virtual AbstractValue & load(u32_t addr)
void join_with(const AbstractValue &other)
bool equals(const AbstractValue &rhs) const

◆ testBinaryOpStmt()

void AETest::testBinaryOpStmt ( )
inline

Definition at line 633 of file ae.cpp.

634 {
635 // test division /
636 assert((IntervalValue(4) / IntervalValue::bottom()).equals(IntervalValue::bottom()));
637 assert((IntervalValue::bottom() / IntervalValue(2)).equals(IntervalValue::bottom()));
638 assert((IntervalValue::top() / IntervalValue(0)).equals(IntervalValue::bottom()));
639 assert((IntervalValue(4) / IntervalValue(2)).equals(IntervalValue(2)));
640 assert((IntervalValue(3) / IntervalValue(2)).equals(IntervalValue(1))); //
641 assert((IntervalValue(-3) / IntervalValue(2)).equals(IntervalValue(-1))); //
642 assert((IntervalValue(1, 3) / IntervalValue(2)).equals(IntervalValue(0, 1))); //
643 assert((IntervalValue(2, 7) / IntervalValue(2)).equals(IntervalValue(1, 3))); //
644 assert((IntervalValue(-3, 3) / IntervalValue(2)).equals(IntervalValue(-1, 1)));
645 assert((IntervalValue(-3, IntervalValue::plus_infinity()) / IntervalValue(2)).equals(IntervalValue(-1, IntervalValue::plus_infinity())));
646 assert((IntervalValue(IntervalValue::minus_infinity(), 3) / IntervalValue(2)).equals(IntervalValue(IntervalValue::minus_infinity(), 1)));
647 assert((IntervalValue(1, 3) / IntervalValue(1, 2)).equals(IntervalValue(0, 3)));//
648 assert((IntervalValue(-3, 3) / IntervalValue(1, 2)).equals(IntervalValue(-3, 3)));
649 assert((IntervalValue(2, 7) / IntervalValue(-2, 3)).equals(IntervalValue(-7, 7))); //
650 assert((IntervalValue(-2, 7) / IntervalValue(-2, 3)).equals(IntervalValue(-7, 7))); //
651 assert((IntervalValue(IntervalValue::minus_infinity(), 7) / IntervalValue(-2, 3)).equals(IntervalValue::top()));
652 assert((IntervalValue(-2, IntervalValue::plus_infinity()) / IntervalValue(-2, 3)).equals(IntervalValue::top()));
653
654 assert((IntervalValue(-2, 7) / IntervalValue(IntervalValue::minus_infinity(), 3)).equals(IntervalValue(-7, 7)));
655 assert((IntervalValue(-2, 7) / IntervalValue(-2, IntervalValue::plus_infinity())).equals(IntervalValue(-7, 7)));
656 assert((IntervalValue(-6, -3) / IntervalValue(3, 9)).equals(IntervalValue(-2, 0)));
657 assert((IntervalValue(-6, 6) / IntervalValue(3, 9)).equals(IntervalValue(-2, 2)));
658
659 // test remainder %
660 assert((IntervalValue(4) % IntervalValue::bottom()).equals(IntervalValue::bottom()));
661 assert((IntervalValue::bottom() % IntervalValue(2)).equals(IntervalValue::bottom()));
662 assert((IntervalValue::top() % IntervalValue(0)).equals(IntervalValue::top()));
663 assert((IntervalValue(4) % IntervalValue(2)).equals(IntervalValue(0)));
664 assert((IntervalValue(3) % IntervalValue(2)).equals(IntervalValue(1)));
665 assert((IntervalValue(-3) % IntervalValue(2)).equals(IntervalValue(-1)));
666 assert((IntervalValue(1, 3) % IntervalValue(2)).equals(IntervalValue(0, 1)));
667 assert((IntervalValue(2, 7) % IntervalValue(2)).equals(IntervalValue(0, 1)));
668 assert((IntervalValue(-3, 3) % IntervalValue(2)).equals(IntervalValue(-1, 1)));
669 assert((IntervalValue(-3, IntervalValue::plus_infinity()) % IntervalValue(2)).equals(IntervalValue(-1, 1)));
670 assert((IntervalValue(IntervalValue::minus_infinity(), 3) % IntervalValue(2)).equals(IntervalValue(-1, 1)));
671 assert((IntervalValue(1, 3) % IntervalValue(1, 2)).equals(IntervalValue(0, 1)));
672 assert((IntervalValue(-3, 3) % IntervalValue(1, 2)).equals(IntervalValue(-1, 1)));
673 assert((IntervalValue(2, 7) % IntervalValue(-2, 3)).equals(IntervalValue::top())); //
674 assert((IntervalValue(-2, 7) % IntervalValue(-2, 3)).equals(IntervalValue::top())); //
675 assert((IntervalValue(IntervalValue::minus_infinity(), 7) % IntervalValue(-2, 3)).equals(IntervalValue::top()));
676 assert((IntervalValue(-2, IntervalValue::plus_infinity()) % IntervalValue(-2, 3)).equals(IntervalValue::top()));
677 assert((IntervalValue(-2, 7) % IntervalValue(IntervalValue::minus_infinity(), 3)).equals(IntervalValue::top()));
678 assert((IntervalValue(-2, 7) % IntervalValue(-2, IntervalValue::plus_infinity())).equals(IntervalValue::top()));
679 assert((IntervalValue(-6, -3) % IntervalValue(3, 9)).equals(IntervalValue(-6, 0)));
680 assert((IntervalValue(-6, 6) % IntervalValue(3, 9)).equals(IntervalValue(-6, 6)));
681
682 // shl <<
683 assert((IntervalValue(IntervalValue::plus_infinity()) << IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(IntervalValue::top())));
684 assert((IntervalValue(IntervalValue::plus_infinity()) << IntervalValue(2, 2)).equals(IntervalValue(IntervalValue::plus_infinity())));
685 assert((IntervalValue(IntervalValue::minus_infinity()) << IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(IntervalValue::top())));
686 assert((IntervalValue(IntervalValue::minus_infinity()) << IntervalValue(2, 2)).equals(IntervalValue(IntervalValue::minus_infinity())));
687 assert((IntervalValue(2, 2) << IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(IntervalValue::top())));
688 assert((IntervalValue(0, 0) << IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(0, 0)));
689 assert((IntervalValue(0) << IntervalValue(31)).equals(IntervalValue(0)));
690 assert((IntervalValue(0) << IntervalValue(31, 32)).equals(IntervalValue(0)));
691 assert((IntervalValue(0) << IntervalValue(-1)).equals(IntervalValue::bottom()));
692 assert((IntervalValue(0) << IntervalValue::bottom()).equals(IntervalValue::bottom()));
693 assert((IntervalValue(1) << IntervalValue(31)).equals(IntervalValue::top()));
694 assert((IntervalValue(-2, -2) << IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(IntervalValue::top())));
695 assert((IntervalValue(0, 0) << IntervalValue(2, 2)).equals(IntervalValue(0, 0)));
696 assert((IntervalValue(2, 2) << IntervalValue(3, 3)).equals(IntervalValue(16, 16)));
697 assert((IntervalValue(-2, -2) << IntervalValue(3, 3)).equals(IntervalValue(-16, -16)));
698
699 assert((IntervalValue(4) << IntervalValue::bottom()).equals(IntervalValue::bottom()));
700 assert((IntervalValue::bottom() << IntervalValue(2)).equals(IntervalValue::bottom()));
701 assert((IntervalValue::top() << IntervalValue(0)).equals(IntervalValue::top()));
702 assert((IntervalValue(4) << IntervalValue(2)).equals(IntervalValue(16)));
703 assert((IntervalValue(3) << IntervalValue(2)).equals(IntervalValue(12)));
704 assert((IntervalValue(-3) << IntervalValue(2)).equals(IntervalValue(-12)));
705 assert((IntervalValue(4) << IntervalValue(-2)).equals(IntervalValue::bottom()));
706 assert((IntervalValue(1, 3) << IntervalValue(2)).equals(IntervalValue(4, 12)));
707 assert((IntervalValue(2, 7) << IntervalValue(2)).equals(IntervalValue(8, 28)));
708 assert((IntervalValue(-3, 3) << IntervalValue(2)).equals(IntervalValue(-12, 12)));
709 assert((IntervalValue(-3, IntervalValue::plus_infinity()) << IntervalValue(2)).equals(IntervalValue(-12, IntervalValue::plus_infinity())));
710 assert((IntervalValue(IntervalValue::minus_infinity(), 3) << IntervalValue(2)).equals(IntervalValue(IntervalValue::minus_infinity(), 12)));
711 assert((IntervalValue(1, 3) << IntervalValue(1, 2)).equals(IntervalValue(2, 12)));
712 assert((IntervalValue(-3, 3) << IntervalValue(1, 2)).equals(IntervalValue(-12, 12)));
713 assert((IntervalValue(2, 7) << IntervalValue(-2, 3)).equals(IntervalValue(2, 56)));
714 assert((IntervalValue(-2, 7) << IntervalValue(-2, 3)).equals(IntervalValue(-16, 56)));
715 assert((IntervalValue(IntervalValue::minus_infinity(), 7) << IntervalValue(-2, 3)).equals(IntervalValue(IntervalValue::minus_infinity(), 56)));
716 assert((IntervalValue(-2, IntervalValue::plus_infinity()) << IntervalValue(-2, 3)).equals(IntervalValue(-16, IntervalValue::plus_infinity())));
717 assert((IntervalValue(-2, 7) << IntervalValue(IntervalValue::minus_infinity(), 3)).equals(IntervalValue(-16, 56)));
718 assert((IntervalValue(-2, 7) << IntervalValue(-2, IntervalValue::plus_infinity())).equals(IntervalValue::top()));
719 assert((IntervalValue(-6, -3) << IntervalValue(3, 9)).equals(IntervalValue(-3072, -24)));
720 assert((IntervalValue(-6, 6) << IntervalValue(3, 9)).equals(IntervalValue(-3072, 3072)));
721 assert((IntervalValue(-2, 7) << IntervalValue(IntervalValue::minus_infinity(), -1)).equals(IntervalValue::bottom()));
722 assert((IntervalValue(0) << IntervalValue::top()).equals(IntervalValue(0)));
723
724
725 // shr >>
726 assert((IntervalValue(IntervalValue::plus_infinity()) >> IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(IntervalValue::plus_infinity())));
727 assert((IntervalValue(IntervalValue::plus_infinity()) >> IntervalValue(2)).equals(IntervalValue(IntervalValue::plus_infinity())));
728 assert((IntervalValue(IntervalValue::minus_infinity()) >> IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(IntervalValue::minus_infinity())));
729 assert((IntervalValue(IntervalValue::minus_infinity()) >> IntervalValue(2)).equals(IntervalValue(IntervalValue::minus_infinity())));
730 assert((IntervalValue(2) >> IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(0)));
731 assert((IntervalValue(0) >> IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(0)));
732 assert((IntervalValue(-2) >> IntervalValue(IntervalValue::plus_infinity())).equals(IntervalValue(-1)));
733 assert((IntervalValue(0) >> IntervalValue(2)).equals(IntervalValue(0)));
734 assert((IntervalValue(15) >> IntervalValue(2)).equals(IntervalValue(3)));
735 assert((IntervalValue(-15) >> IntervalValue(2)).equals(IntervalValue(-4)));
736
737 assert((IntervalValue(4) >> IntervalValue::bottom()).equals(IntervalValue::bottom()));
738 assert((IntervalValue::bottom() >> IntervalValue(2)).equals(IntervalValue::bottom()));
739 assert((IntervalValue::top() >> IntervalValue(0)).equals(IntervalValue::top()));
740 assert((IntervalValue(15) >> IntervalValue(2)).equals(IntervalValue(3)));
741 assert((IntervalValue(1) >> IntervalValue(2)).equals(IntervalValue(0)));
742 assert((IntervalValue(-15) >> IntervalValue(2)).equals(IntervalValue(-4)));
743 assert((IntervalValue(4) >> IntervalValue(-2)).equals(IntervalValue::bottom()));
744 assert((IntervalValue(1, 3) >> IntervalValue(2)).equals(IntervalValue(0)));
745 assert((IntervalValue(2, 7) >> IntervalValue(2)).equals(IntervalValue(0, 1)));
746 assert((IntervalValue(-15, 15) >> IntervalValue(2)).equals(IntervalValue(-4, 3)));
747 assert((IntervalValue(-15, IntervalValue::plus_infinity()) >> IntervalValue(2)).equals(IntervalValue(-4, IntervalValue::plus_infinity())));
748 assert((IntervalValue(IntervalValue::minus_infinity(), 15) >> IntervalValue(2)).equals(IntervalValue(IntervalValue::minus_infinity(), 3)));
749 assert((IntervalValue(0, 15) >> IntervalValue(1, 2)).equals(IntervalValue(0, 7)));
750 assert((IntervalValue(-17, 15) >> IntervalValue(1, 2)).equals(IntervalValue(-9, 7)));
751 assert((IntervalValue(2, 7) >> IntervalValue(-2, 3)).equals(IntervalValue(0, 7)));
752 assert((IntervalValue(-2, 7) >> IntervalValue(-2, 3)).equals(IntervalValue(-2, 7)));
753 assert((IntervalValue(IntervalValue::minus_infinity(), 7) >> IntervalValue(-2, 3)).equals(IntervalValue(IntervalValue::minus_infinity(), 7)));
754 assert((IntervalValue(-2, IntervalValue::plus_infinity()) >> IntervalValue(-2, 3)).equals(IntervalValue(-2, IntervalValue::plus_infinity())));
755 assert((IntervalValue(-2, 7) >> IntervalValue(IntervalValue::minus_infinity(), 3)).equals(IntervalValue(-2, 7)));
756 assert((IntervalValue(-2, 7) >> IntervalValue(-2, IntervalValue::plus_infinity())).equals(IntervalValue(-2, 7)));
757 assert((IntervalValue(-6, -3) >> IntervalValue(2, 3)).equals(IntervalValue(-2, -1)));
758 assert((IntervalValue(-6, 6) >> IntervalValue(2, 3)).equals(IntervalValue(-2, 1)));
759 assert((IntervalValue(-2, 7) >> IntervalValue(IntervalValue::minus_infinity(), -1)).equals(IntervalValue::bottom()));
760 assert((IntervalValue(0) >> IntervalValue::top()).equals(IntervalValue(0)));
761
762 // and &
763 assert((IntervalValue(4) & IntervalValue::bottom()).equals(IntervalValue::bottom()));
764 assert((IntervalValue::bottom() & IntervalValue(2)).equals(IntervalValue::bottom()));
765 assert((IntervalValue::top() & IntervalValue(0)).equals(IntervalValue(0)));
766 assert((IntervalValue(4) & IntervalValue(2)).equals(IntervalValue(0)));
767 assert((IntervalValue(3) & IntervalValue(2)).equals(IntervalValue(2)));
768 assert((IntervalValue(-3) & IntervalValue(2)).equals(IntervalValue(0)));
769 assert((IntervalValue(1, 3) & IntervalValue(2)).equals(IntervalValue(0, 2)));
770 assert((IntervalValue(2, 7) & IntervalValue(2)).equals(IntervalValue(0, 2)));
771 assert((IntervalValue(-3, 3) & IntervalValue(2)).equals(IntervalValue(0, 2)));
772 assert((IntervalValue(-3, IntervalValue::plus_infinity()) & IntervalValue(2)).equals(IntervalValue(0, 2)));
773 assert((IntervalValue(IntervalValue::minus_infinity(), 3) & IntervalValue(2)).equals(IntervalValue(0, 2)));
774 assert((IntervalValue(1, 3) & IntervalValue(1, 2)).equals(IntervalValue(0, 2)));
775 assert((IntervalValue(-3, 3) & IntervalValue(1, 2)).equals(IntervalValue(0, 2)));
776 assert((IntervalValue(2, 7) & IntervalValue(-2, 3)).equals(IntervalValue(0, 7)));
777 assert((IntervalValue(-2, 7) & IntervalValue(-2, 3)).equals(IntervalValue::top()));
778 assert((IntervalValue(IntervalValue::minus_infinity(), 7) & IntervalValue(-2, 3)).equals(IntervalValue::top()));
779 assert((IntervalValue(-2, IntervalValue::plus_infinity()) & IntervalValue(-2, 3)).equals(IntervalValue::top()));
780 assert((IntervalValue(-2, 7) & IntervalValue(IntervalValue::minus_infinity(), 3)).equals(IntervalValue::top()));
781 assert((IntervalValue(-2, 7) & IntervalValue(-2, IntervalValue::plus_infinity())).equals(IntervalValue::top()));
782 assert((IntervalValue(-6, -3) & IntervalValue(3, 9)).equals(IntervalValue(0, 9)));
783 assert((IntervalValue(-6, 6) & IntervalValue(3, 9)).equals(IntervalValue(0, 9)));
784
785 // Or |
786 assert((IntervalValue(4) | IntervalValue::bottom()).equals(IntervalValue::bottom()));
787 assert((IntervalValue::bottom() | IntervalValue(2)).equals(IntervalValue::bottom()));
788 assert((IntervalValue::top() | IntervalValue(-1)).equals(IntervalValue::top()));//
789 assert((IntervalValue(-1) | IntervalValue::top()).equals(IntervalValue::top()));//
790 assert((IntervalValue(4) | IntervalValue(2)).equals(IntervalValue(6)));
791 assert((IntervalValue(3) | IntervalValue(2)).equals(IntervalValue(3)));
792 assert((IntervalValue(-3) | IntervalValue(2)).equals(IntervalValue(-1)));
793 assert((IntervalValue(1, 3) | IntervalValue(2)).equals(IntervalValue(0, 3)));
794 assert((IntervalValue(2, 7) | IntervalValue(2)).equals(IntervalValue(0, 7)));
795 assert((IntervalValue(-3, 3) | IntervalValue(2)).equals(IntervalValue::top()));
796 assert((IntervalValue(-3, IntervalValue::plus_infinity()) | IntervalValue(2)).equals(IntervalValue::top()));
797 assert((IntervalValue(IntervalValue::minus_infinity(), 3) | IntervalValue(2)).equals(IntervalValue::top()));
798 assert((IntervalValue(1, 3) | IntervalValue(1, 2)).equals(IntervalValue(0, 3)));
799 assert((IntervalValue(-3, 3) | IntervalValue(1, 2)).equals(IntervalValue::top()));
800 assert((IntervalValue(2, 7) | IntervalValue(-2, 3)).equals(IntervalValue::top()));
801 assert((IntervalValue(-2, 7) | IntervalValue(-2, 3)).equals(IntervalValue::top()));
802 assert((IntervalValue(IntervalValue::minus_infinity(), 7) | IntervalValue(-2, 3)).equals(IntervalValue::top()));
803 assert((IntervalValue(-2, IntervalValue::plus_infinity()) | IntervalValue(-2, 3)).equals(IntervalValue::top()));
804 assert((IntervalValue(-2, 7) | IntervalValue(IntervalValue::minus_infinity(), 3)).equals(IntervalValue::top()));
805 assert((IntervalValue(-2, 7) | IntervalValue(-2, IntervalValue::plus_infinity())).equals(IntervalValue::top()));
806 assert((IntervalValue(-6, -3) | IntervalValue(3, 9)).equals(IntervalValue::top()));
807 assert((IntervalValue(-6, 6) | IntervalValue(3, 9)).equals(IntervalValue::top()));
808
809 // Xor ^
810 assert((IntervalValue(4) ^ IntervalValue::bottom()).equals(IntervalValue::bottom()));
811 assert((IntervalValue::bottom() ^ IntervalValue(2)).equals(IntervalValue::bottom()));
812 assert((IntervalValue::top() ^ IntervalValue(-1)).equals(IntervalValue::top()));
813 assert((IntervalValue(-1) ^ IntervalValue::top()).equals(IntervalValue::top()));
814 assert((IntervalValue(4) ^ IntervalValue(2)).equals(IntervalValue(6)));
815 assert((IntervalValue(3) ^ IntervalValue(2)).equals(IntervalValue(1)));
816 assert((IntervalValue(-3) ^ IntervalValue(2)).equals(IntervalValue(-1)));
817 assert((IntervalValue(1, 3) ^ IntervalValue(2)).equals(IntervalValue(0, 3)));
818 assert((IntervalValue(2, 7) ^ IntervalValue(2)).equals(IntervalValue(0, 7)));
819 assert((IntervalValue(-3, 3) ^ IntervalValue(2)).equals(IntervalValue::top()));
820 assert((IntervalValue(-3, IntervalValue::plus_infinity()) ^ IntervalValue(2)).equals(IntervalValue::top()));
821 assert((IntervalValue(IntervalValue::minus_infinity(), 3) ^ IntervalValue(2)).equals(IntervalValue::top()));
822 assert((IntervalValue(1, 3) ^ IntervalValue(1, 2)).equals(IntervalValue(0, 3)));
823 assert((IntervalValue(-3, 3) ^ IntervalValue(1, 2)).equals(IntervalValue::top()));
824 assert((IntervalValue(2, 7) ^ IntervalValue(-2, 3)).equals(IntervalValue::top()));
825 assert((IntervalValue(-2, 7) ^ IntervalValue(-2, 3)).equals(IntervalValue::top()));
826 assert((IntervalValue(IntervalValue::minus_infinity(), 7) ^ IntervalValue(-2, 3)).equals(IntervalValue::top()));
827 assert((IntervalValue(-2, IntervalValue::plus_infinity()) ^ IntervalValue(-2, 3)).equals(IntervalValue::top()));
828 assert((IntervalValue(-2, 7) ^ IntervalValue(IntervalValue::minus_infinity(), 3)).equals(IntervalValue::top()));
829 assert((IntervalValue(-2, 7) ^ IntervalValue(-2, IntervalValue::plus_infinity())).equals(IntervalValue::top()));
830 assert((IntervalValue(-6, -3) ^ IntervalValue(3, 9)).equals(IntervalValue::top()));
831 assert((IntervalValue(-6, 6) ^ IntervalValue(3, 9)).equals(IntervalValue::top()));
832 }
static BoundedInt minus_infinity()
Get minus infinity -inf.
static IntervalValue bottom()
Create the bottom IntervalValue [+inf, -inf].
static BoundedInt plus_infinity()
Get plus infinity +inf.
static IntervalValue top()
Create the IntervalValue [-inf, +inf].

The documentation for this class was generated from the following file: