diff --git a/server/src/Tests.cpp b/server/src/Tests.cpp index 8103bb92..1d39a19c 100644 --- a/server/src/Tests.cpp +++ b/server/src/Tests.cpp @@ -774,7 +774,8 @@ void KTestObjectParser::assignAllLazyPointers( testCase.lazyReferences.emplace_back( fromPtr.varName, toPtrName, PrinterUtils::initializePointerToVar(fromPtr.type.baseType(), toPtrName, - fromPtr.type.getDimension())); + fromPtr.type.getDimension(), + fromPtr.type.isConstQualifiedValue())); } } } @@ -1233,13 +1234,15 @@ KTestObjectParser::getLazyPointerView(const std::vector &objec initReferences.emplace_back( name, ptr_element->name, PrinterUtils::initializePointerToVar(paramType.baseType(), ptr_element->name, - paramType.getDimension())); + paramType.getDimension(), + paramType.isConstQualifiedValue())); } if (lazyPointer || ptr_element != objects.end()) { res = PrinterUtils::C_NULL; } return std::make_shared( - PrinterUtils::initializePointer(paramType.baseType(), res, paramType.getDimension())); + PrinterUtils::initializePointer(paramType.baseType(), res, paramType.getDimension(), + paramType.isConstQualifiedValue())); } bool Tests::MethodDescription::operator==(const Tests::MethodDescription &other) const { diff --git a/server/src/Tests.h b/server/src/Tests.h index c3abb4a9..65b0bb6c 100644 --- a/server/src/Tests.h +++ b/server/src/Tests.h @@ -380,7 +380,7 @@ namespace tests { [[nodiscard]] std::string getFunctionParamDecl() const { if (type.isTwoDimensionalPointer() && types::TypesHandler::isVoid(type.baseTypeObj())) { - std::string qualifier = type.isConstQualified() ? "const " : ""; + std::string qualifier = PrinterUtils::getConstQualifier(type.isConstQualifiedValue()); return StringUtils::stringFormat("(%svoid **) %s", qualifier, name); } else if (type.isRValueReference()) { return "std::move(" + name + ")"; diff --git a/server/src/utils/PrinterUtils.cpp b/server/src/utils/PrinterUtils.cpp index 5edd1c9d..218406c2 100644 --- a/server/src/utils/PrinterUtils.cpp +++ b/server/src/utils/PrinterUtils.cpp @@ -27,7 +27,7 @@ namespace PrinterUtils { } std::string getterDecl(const std::string &returnTypeName, - const std::string &wrapperName) { + const std::string &wrapperName) { std::string gName = getterName(wrapperName); return StringUtils::stringFormat("%s %s()", returnTypeName, gName); } @@ -46,6 +46,10 @@ namespace PrinterUtils { return StringUtils::stringFormat("access_private::%s(%s)", fieldName, objectName); } + std::string getConstQualifier(bool constQualifiedValue) { + return constQualifiedValue ? "const " : ""; + } + std::string fillVarName(std::string const &access, std::string const &varName) { return StringUtils::stringFormat(access, varName); } @@ -66,21 +70,25 @@ namespace PrinterUtils { std::string initializePointer(const std::string &type, const std::string &value, - size_t additionalPointersCount) { + size_t additionalPointersCount, + bool pointerToConstQualifiedValue) { if (value == C_NULL || std::stoull(value) == 0) { return C_NULL; } else { std::string additionalPointers = StringUtils::repeat("*", additionalPointersCount); - return StringUtils::stringFormat("(%s%s) 0x%lx", type, additionalPointers, + std::string qualifier = getConstQualifier(pointerToConstQualifiedValue); + return StringUtils::stringFormat("(%s%s%s) 0x%lx", qualifier, type, additionalPointers, std::stoull(value)); } } std::string initializePointerToVar(const std::string &type, const std::string &varName, - size_t additionalPointersCount) { + size_t additionalPointersCount, + bool pointerToConstQualifiedValue) { std::string additionalPointers = StringUtils::repeat("*", additionalPointersCount); - return StringUtils::stringFormat("(%s%s) &%s", type, additionalPointers, varName); + std::string qualifier = getConstQualifier(pointerToConstQualifiedValue); + return StringUtils::stringFormat("(%s%s%s) &%s", qualifier, type, additionalPointers, varName); } std::string generateNewVar(int cnt) { diff --git a/server/src/utils/PrinterUtils.h b/server/src/utils/PrinterUtils.h index 94b4d70b..f9fd243a 100644 --- a/server/src/utils/PrinterUtils.h +++ b/server/src/utils/PrinterUtils.h @@ -75,6 +75,8 @@ namespace PrinterUtils { std::string getFieldAccess(const std::string &objectName, const types::Field &field); + std::string getConstQualifier(bool constQualifiedValue); + std::string fillVarName(std::string const &temp, std::string const &varName); void appendIndicesToVarName(std::string &varName, const std::vector &sizes, size_t offset); @@ -95,11 +97,13 @@ namespace PrinterUtils { std::string initializePointer(const std::string &type, const std::string &value, - size_t additionalPointersCount); + size_t additionalPointersCount, + bool pointerToConstQualifiedValue); std::string initializePointerToVar(const std::string &type, const std::string &varName, - size_t additionalPointersCount); + size_t additionalPointersCount, + bool pointerToConstQualifiedValue); std::string generateNewVar(int cnt); diff --git a/server/test/suites/server/multi_dim_pointers.c b/server/test/suites/server/multi_dim_pointers.c index 15146509..15d37ad1 100644 --- a/server/test/suites/server/multi_dim_pointers.c +++ b/server/test/suites/server/multi_dim_pointers.c @@ -8,6 +8,9 @@ int func_with_multi_dim_pointer(struct MainStruct **str) { struct MainStruct *ptr = *str; int sz = 0; if (ptr) { + if (!ptr->name) { + return -1; + } struct ElementStruct *e = ptr->list.head; struct ElementStruct *n; for (int i = 0; i < 5; i++) { diff --git a/server/test/suites/server/multi_dim_pointers.h b/server/test/suites/server/multi_dim_pointers.h index 7dce8b47..c71e47bc 100644 --- a/server/test/suites/server/multi_dim_pointers.h +++ b/server/test/suites/server/multi_dim_pointers.h @@ -14,6 +14,7 @@ struct ListStruct { struct MainStruct { struct ListStruct list; + const char **name; }; int func_with_multi_dim_pointer(struct MainStruct **str);