Skip to content

Commit df038ef

Browse files
committed
Support assignment of lazy pointers in case of a multidimensional pointer as a parameter of a function
1 parent 593344f commit df038ef

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

server/src/Tests.cpp

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -593,8 +593,9 @@ void KTestObjectParser::addToOrder(const std::vector<UTBotKTestObject> &objects,
593593
if (it != objects.end()) {
594594
size_t jsonInd = it - objects.begin();
595595
visited[jsonInd] = true;
596-
Tests::MethodParam param = {paramType.isObjectPointer() ? paramType.baseTypeObj()
597-
: paramType,
596+
Tests::MethodParam param = { paramType.isObjectPointer() && !paramType.isPointerToPointer()
597+
? paramType.baseTypeObj()
598+
: paramType,
598599
paramName, std::nullopt };
599600
order.emplace(jsonInd, param, paramValue);
600601
return;
@@ -653,8 +654,9 @@ void KTestObjectParser::assignTypeUnnamedVar(
653654
if (indexOffset != 0) {
654655
continue;
655656
}
656-
types::Type fieldType =
657-
traverseLazyInStruct(paramType, SizeUtils::bytesToBits(offset)).type;
657+
Tests::TypeAndVarName typeAndName = { paramType, "" };
658+
size_t offsetInStruct = getOffsetInStruct(typeAndName, SizeUtils::bytesToBits(offset));
659+
types::Type fieldType = traverseLazyInStruct(typeAndName.type, offsetInStruct).type;
658660
if (!pointToStruct(fieldType, testCase.objects[indObj])) {
659661
continue;
660662
}
@@ -698,6 +700,26 @@ Tests::TypeAndVarName KTestObjectParser::traverseLazyInStruct(const types::Type
698700
}
699701
}
700702

703+
size_t KTestObjectParser::getOffsetInStruct(Tests::TypeAndVarName &objTypeAndName, size_t offsetInBits) const {
704+
if (!objTypeAndName.type.isPointerToPointer()) {
705+
return offsetInBits;
706+
}
707+
std::vector<size_t> sizes = objTypeAndName.type.arraysSizes(types::PointerUsage::PARAMETER);
708+
size_t dimension = sizes.size();
709+
objTypeAndName.type = objTypeAndName.type.baseTypeObj();
710+
size_t sizeInBits = typesHandler.typeSize(objTypeAndName.type);
711+
size_t offset = offsetInBits / sizeInBits;
712+
std::string indices;
713+
while (dimension != 0) {
714+
size_t index = offset % sizes[--dimension];
715+
offset /= sizes[dimension];
716+
indices = StringUtils::stringFormat("[%d]%s", index, indices);
717+
}
718+
objTypeAndName.varName += indices;
719+
offsetInBits %= sizeInBits;
720+
return offsetInBits;
721+
}
722+
701723
void KTestObjectParser::assignTypeStubVar(Tests::MethodTestCase &testCase,
702724
const Tests::MethodDescription &methodDescription) {
703725
for (auto const &obj : testCase.objects) {
@@ -724,21 +746,25 @@ void KTestObjectParser::assignAllLazyPointers(
724746
continue;
725747
}
726748
for (const auto &pointer : object.pointers) {
727-
Tests::TypeAndVarName fromPtr = traverseLazyInStruct(
728-
objTypeAndName[ind]->type, SizeUtils::bytesToBits(pointer.offset),
729-
objTypeAndName[ind]->varName);
749+
Tests::TypeAndVarName typeAndName = objTypeAndName[ind].value();
750+
size_t offset =
751+
getOffsetInStruct(typeAndName, SizeUtils::bytesToBits(pointer.offset));
752+
Tests::TypeAndVarName fromPtr =
753+
traverseLazyInStruct(typeAndName.type, offset, typeAndName.varName);
730754
if (!objTypeAndName[pointer.index].has_value()) {
731755
continue;
732756
}
733757

734758
std::string toPtrName;
735-
if (pointer.indexOffset == 0 &&
759+
Tests::TypeAndVarName pointerTypeAndName = objTypeAndName[pointer.index].value();
760+
size_t indexOffset =
761+
getOffsetInStruct(pointerTypeAndName, SizeUtils::bytesToBits(pointer.indexOffset));
762+
if (indexOffset == 0 &&
736763
pointToStruct(fromPtr.type, testCase.objects[pointer.index])) {
737-
toPtrName = objTypeAndName[pointer.index]->varName;
764+
toPtrName = pointerTypeAndName.varName;
738765
} else {
739-
toPtrName = traverseLazyInStruct(objTypeAndName[pointer.index]->type,
740-
SizeUtils::bytesToBits(pointer.indexOffset),
741-
objTypeAndName[pointer.index]->varName).varName;
766+
toPtrName = traverseLazyInStruct(pointerTypeAndName.type, indexOffset,
767+
pointerTypeAndName.varName).varName;
742768
}
743769

744770
testCase.lazyReferences.emplace_back(

server/src/Tests.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,8 @@ namespace tests {
843843
size_t offsetInBits,
844844
const std::string &curVarName = "") const;
845845

846+
size_t getOffsetInStruct(Tests::TypeAndVarName &objTypeAndName, size_t offsetInBits) const;
847+
846848
std::shared_ptr<AbstractValueView>
847849
getLazyPointerView(const std::vector<UTBotKTestObject> &objects,
848850
std::vector<InitReference> &initReferences,

0 commit comments

Comments
 (0)