@@ -587,12 +587,14 @@ void KTestObjectParser::addToOrder(const std::vector<UTBotKTestObject> &objects,
587
587
const types::Type ¶mType,
588
588
Tests::TestCaseParamValue ¶mValue,
589
589
std::vector<bool > &visited,
590
+ std::vector<PointerUsage> &usages,
590
591
std::queue<JsonIndAndParam> &order) {
591
592
auto it = std::find_if (objects.begin (), objects.end (),
592
593
[paramName](const UTBotKTestObject &obj) { return obj.name == paramName; });
593
594
if (it != objects.end ()) {
594
595
size_t jsonInd = it - objects.begin ();
595
596
visited[jsonInd] = true ;
597
+ usages[jsonInd] = types::PointerUsage::PARAMETER;
596
598
Tests::MethodParam param = { paramType.isObjectPointer () && !paramType.isPointerToPointer ()
597
599
? paramType.baseTypeObj ()
598
600
: paramType,
@@ -615,16 +617,17 @@ bool KTestObjectParser::pointToStruct(const types::Type &pointerType,
615
617
void KTestObjectParser::assignTypeUnnamedVar (
616
618
Tests::MethodTestCase &testCase,
617
619
const Tests::MethodDescription &methodDescription,
618
- std::vector<std::optional<Tests::TypeAndVarName>> &objects) {
620
+ std::vector<std::optional<Tests::TypeAndVarName>> &objects,
621
+ std::vector<PointerUsage> &usages) {
619
622
std::queue<JsonIndAndParam> order;
620
623
std::vector<bool > visited (testCase.objects .size (), false );
621
624
for (size_t paramInd = 0 ; paramInd < testCase.paramValues .size (); paramInd++) {
622
625
addToOrder (testCase.objects , methodDescription.params [paramInd].name ,
623
626
methodDescription.params [paramInd].type , testCase.paramValues [paramInd], visited,
624
- order);
627
+ usages, order);
625
628
}
626
629
addToOrder (testCase.objects , KleeUtils::RESULT_VARIABLE_NAME, methodDescription.returnType ,
627
- testCase.returnValue , visited, order);
630
+ testCase.returnValue , visited, usages, order);
628
631
629
632
while (!order.empty ()) {
630
633
auto curType = order.front ();
@@ -638,6 +641,7 @@ void KTestObjectParser::assignTypeUnnamedVar(
638
641
throw UnImplementedException (" Lazy variable has baseType=void" );
639
642
}
640
643
644
+ usages[curType.jsonInd ] = types::PointerUsage::LAZY;
641
645
std::vector<char > byteValue = testCase.objects [curType.jsonInd ].bytes ;
642
646
Tests::TypeAndVarName typeAndVarName{ paramType, name };
643
647
std::shared_ptr<AbstractValueView> testParamView = testParameterView (
@@ -655,7 +659,8 @@ void KTestObjectParser::assignTypeUnnamedVar(
655
659
continue ;
656
660
}
657
661
Tests::TypeAndVarName typeAndName = { paramType, " " };
658
- size_t offsetInStruct = getOffsetInStruct (typeAndName, SizeUtils::bytesToBits (offset));
662
+ size_t offsetInStruct =
663
+ getOffsetInStruct (typeAndName, SizeUtils::bytesToBits (offset), usages[indObj]);
659
664
types::Type fieldType = traverseLazyInStruct (typeAndName.type , offsetInStruct).type ;
660
665
if (!pointToStruct (fieldType, testCase.objects [indObj])) {
661
666
continue ;
@@ -700,11 +705,13 @@ Tests::TypeAndVarName KTestObjectParser::traverseLazyInStruct(const types::Type
700
705
}
701
706
}
702
707
703
- size_t KTestObjectParser::getOffsetInStruct (Tests::TypeAndVarName &objTypeAndName, size_t offsetInBits) const {
704
- if (!objTypeAndName.type .isPointerToPointer ()) {
708
+ size_t KTestObjectParser::getOffsetInStruct (Tests::TypeAndVarName &objTypeAndName,
709
+ size_t offsetInBits,
710
+ types::PointerUsage usage) const {
711
+ if (!objTypeAndName.type .isPointerToPointer () || usage != types::PointerUsage::PARAMETER) {
705
712
return offsetInBits;
706
713
}
707
- std::vector<size_t > sizes = objTypeAndName.type .arraysSizes (types::PointerUsage::PARAMETER );
714
+ std::vector<size_t > sizes = objTypeAndName.type .arraysSizes (usage );
708
715
size_t dimension = sizes.size ();
709
716
objTypeAndName.type = objTypeAndName.type .baseTypeObj ();
710
717
size_t sizeInBits = typesHandler.typeSize (objTypeAndName.type );
@@ -739,16 +746,18 @@ void KTestObjectParser::assignTypeStubVar(Tests::MethodTestCase &testCase,
739
746
740
747
void KTestObjectParser::assignAllLazyPointers (
741
748
Tests::MethodTestCase &testCase,
742
- const std::vector<std::optional<Tests::TypeAndVarName>> &objTypeAndName) const {
749
+ const std::vector<std::optional<Tests::TypeAndVarName>> &objTypeAndName,
750
+ const std::vector<PointerUsage> &usages) const {
743
751
for (size_t ind = 0 ; ind < testCase.objects .size (); ind++) {
744
752
const auto &object = testCase.objects [ind];
745
753
if (!objTypeAndName[ind].has_value ()) {
746
754
continue ;
747
755
}
748
756
for (const auto &pointer : object.pointers ) {
749
757
Tests::TypeAndVarName typeAndName = objTypeAndName[ind].value ();
750
- size_t offset =
751
- getOffsetInStruct (typeAndName, SizeUtils::bytesToBits (pointer.offset ));
758
+ size_t offset = getOffsetInStruct (typeAndName,
759
+ SizeUtils::bytesToBits (pointer.offset ),
760
+ usages[ind]);
752
761
Tests::TypeAndVarName fromPtr =
753
762
traverseLazyInStruct (typeAndName.type , offset, typeAndName.varName );
754
763
if (!objTypeAndName[pointer.index ].has_value ()) {
@@ -757,8 +766,9 @@ void KTestObjectParser::assignAllLazyPointers(
757
766
758
767
std::string toPtrName;
759
768
Tests::TypeAndVarName pointerTypeAndName = objTypeAndName[pointer.index ].value ();
760
- size_t indexOffset =
761
- getOffsetInStruct (pointerTypeAndName, SizeUtils::bytesToBits (pointer.indexOffset ));
769
+ size_t indexOffset = getOffsetInStruct (pointerTypeAndName,
770
+ SizeUtils::bytesToBits (pointer.indexOffset ),
771
+ usages[pointer.index ]);
762
772
if (indexOffset == 0 &&
763
773
pointToStruct (fromPtr.type , testCase.objects [pointer.index ])) {
764
774
toPtrName = pointerTypeAndName.varName ;
@@ -852,11 +862,11 @@ void KTestObjectParser::parseTestCases(const UTBotKTestList &cases,
852
862
traceStream << " \t return: " << testCase.returnValue .view ->getEntryValue (nullptr );
853
863
LOG_S (MAX) << traceStream.str ();
854
864
855
- std::vector<std::optional<Tests::TypeAndVarName>> objectsValues (
856
- testCase.objects .size ());
857
- assignTypeUnnamedVar (testCase, methodDescription, objectsValues);
865
+ std::vector<std::optional<Tests::TypeAndVarName>> objectsValues (testCase. objects . size ());
866
+ std::vector<PointerUsage> usages ( testCase.objects .size ());
867
+ assignTypeUnnamedVar (testCase, methodDescription, objectsValues, usages );
858
868
assignTypeStubVar (testCase, methodDescription);
859
- assignAllLazyPointers (testCase, objectsValues);
869
+ assignAllLazyPointers (testCase, objectsValues, usages );
860
870
861
871
methodDescription.testCases .push_back (testCase);
862
872
methodDescription.suiteTestCases [testCase.suiteName ].push_back (testCase.testIndex );
0 commit comments