Skip to content

Commit d059ef4

Browse files
committed
Update tester.hpp
1 parent cdbd77f commit d059ef4

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

lifter/tester.hpp

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,22 @@ struct TestCase {
3838
uint64_t value;
3939
};
4040

41-
struct FlagsState {
41+
struct FlagsStatus {
4242
Flag flag;
43-
FlagState state;
43+
FlagState state = UNKNOWN; // to catch bugs
4444
};
4545

4646
std::string name;
4747

4848
// Inputs
4949
std::vector<uint8_t> instruction_bytes;
5050
std::vector<RegisterState> initial_registers;
51-
std::vector<FlagsState> initial_flags;
51+
std::vector<FlagsStatus> initial_flags;
5252

5353
// Expected outputs
5454
std::vector<RegisterState> expected_registers;
55-
std::vector<FlagsState> expected_flags;
55+
std::vector<FlagsStatus> expected_flags;
56+
bool couldBeUndefined = true;
5657
};
5758

5859
class Tester {
@@ -73,6 +74,19 @@ class Tester {
7374
testCases.emplace_back(fn);
7475
}
7576

77+
std::vector<TestCase::FlagsStatus> parseFlagStates(uint64_t flagint) {
78+
std::vector<TestCase::FlagsStatus> result;
79+
result.resize(FLAGS_END);
80+
81+
for (size_t i = 0; i < FLAGS_END; i++) {
82+
bool isSet = (flagint >> i) & 1;
83+
result[i] = TestCase::FlagsStatus{
84+
.flag = (Flag)i, .state = isSet ? FlagState::SET : FlagState::CLEAR};
85+
}
86+
87+
return result;
88+
}
89+
7690
bool execute_test_case(const TestCase& tc) {
7791

7892
bool isSuccessfull = true;
@@ -92,7 +106,8 @@ class Tester {
92106
// Verify registers
93107
for (const auto& expected : tc.expected_registers) {
94108
// registers usually shouldn't be undefined
95-
if (!isRegisterEqualTo(expected.reg, expected.value, false)) {
109+
if (!isRegisterEqualTo(expected.reg, expected.value,
110+
tc.couldBeUndefined)) {
96111

97112
failureDetails << "Incorrect register:" << "\n Register: "
98113
<< ZydisRegisterGetString(expected.reg)
@@ -110,13 +125,21 @@ class Tester {
110125
}
111126
}
112127

128+
const auto flagcompare = [](FlagState original, FlagState compare,
129+
bool couldBeUndefined = true) {
130+
if (couldBeUndefined && original == FlagState::UNDEF)
131+
return true;
132+
return original == compare;
133+
};
134+
113135
for (const auto& flag : tc.expected_flags) {
114136
FlagState flagState = getFlagState(flag.flag);
115-
if (flagState != flag.state) {
137+
if (!flagcompare(flagState, flag.state, tc.couldBeUndefined)) {
138+
116139
failureDetails << "Incorrect flag:" //
117-
<< "\n Flag: " << flag.flag
118-
<< "\n Expected: " << flag.state
119-
<< "\n Actual: " << flagState;
140+
<< "\n Flag: " << flag.flag << "(" << (int)flag.flag
141+
<< ")" << "\n Expected: " << flag.state
142+
<< "\n Actual: " << flagState << "\n";
120143

121144
isSuccessfull = false;
122145
}

0 commit comments

Comments
 (0)