Static Value-Flow Analysis
Public Member Functions | List of all members
AETest Class Reference

Public Member Functions

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

Detailed Description

Definition at line 625 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 828 of file ae.cpp.

829  {
830  AbstractState as;
831  as[1] = IntervalValue(1, 3);
832  as[2] = IntervalValue(2, 7);
833  as[3] = AddressValue(0x7f000007);
834  as[4] = AddressValue(0x7f000008);
835  as.storeValue(3, as[1]);
836  as.storeValue(4, as[2]);
837  as.printAbstractState();
838  assert(as.loadValue(3).equals(as[1]) && as.loadValue(4).equals(as[2]));
839  }
void printAbstractState() const
AbstractValue loadValue(NodeID varId)
void storeValue(NodeID varId, AbstractValue val)
bool equals(const AbstractValue &rhs) const

◆ testBinaryOpStmt()

void AETest::testBinaryOpStmt ( )
inline

Definition at line 632 of file ae.cpp.

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

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