9
9
#include " utils/ArgumentsUtils.h"
10
10
#include " utils/Copyright.h"
11
11
#include " visitors/VerboseParameterVisitor.h"
12
+ #include " printers/KleeConstraintsPrinter.h"
12
13
13
14
#include " loguru.h"
14
15
@@ -385,15 +386,30 @@ namespace printer {
385
386
return ss;
386
387
}
387
388
389
+ std::stringstream& Printer::checkOverflowStubArray (const string &cntCall) {
390
+ ss << TAB_N () << " if (" << cntCall << " == " <<
391
+ types::TypesHandler::getElementsNumberInPointerOneDim (types::PointerUsage::PARAMETER) << " ) {" << NL;
392
+ tabsDepth++;
393
+ ss << TAB_N () << cntCall << " --;" << NL;
394
+ ss << RB ();
395
+ return ss;
396
+ }
397
+
398
+
388
399
std::stringstream &Printer::strStubForMethod (const Tests::MethodDescription &method,
389
400
const types::TypesHandler &typesHandler,
390
401
const string &prefix,
391
402
const string &suffix,
392
- bool makeSymbolic,
393
403
bool makeStatic) {
394
404
auto methodCopy = method;
395
-
396
405
methodCopy.name = method.name ;
406
+
407
+ string stubSymbolicVarName = getStubSymbolicVarName (method.name );
408
+ if (!types::TypesHandler::isVoid (method.returnType )) {
409
+ strDeclareArrayVar (types::Type::createArray (method.returnType ), stubSymbolicVarName,
410
+ types::PointerUsage::PARAMETER);
411
+ }
412
+
397
413
if (!prefix.empty ()) {
398
414
methodCopy.name = prefix + " _" + methodCopy.name ;
399
415
}
@@ -411,23 +427,31 @@ namespace printer {
411
427
strReturn (returnValue) << RB () << NL;
412
428
return ss;
413
429
}
414
- if (makeSymbolic) {
415
- string firstTimeCallVar = " firstTimeCall" ;
416
- string stubSymbolicVarName = getStubSymbolicVarName (method.name );
417
- strDeclareVar (" static int" , firstTimeCallVar, " 1" );
418
- ss << TAB_N () << " #ifdef " << PrinterUtils::KLEE_MODE << NL;
419
- tabsDepth++;
420
- ss << TAB_N () << " if (" << firstTimeCallVar << " == 1)" << LB ();
421
- strAssignVar (firstTimeCallVar, " 0" );
422
- strKleeMakeSymbolic (stubSymbolicVarName, !method.returnType .isArray (),
423
- stubSymbolicVarName);
424
- ss << RB ();
425
- tabsDepth--;
426
- ss << TAB_N () << " #endif" << NL;
427
- returnValue = stubSymbolicVarName;
428
- } else {
429
- returnValue = typesHandler.getDefaultValueForType (methodCopy.returnType , getLanguage ());
430
- }
430
+
431
+ string firstTimeCallVar = " firstTimeCall" ;
432
+ strDeclareVar (" static int" , firstTimeCallVar, " 1" );
433
+ const string cntCall = " cntCall" ;
434
+ strDeclareVar (" static int" , cntCall, " 0" );
435
+ ss << TAB_N () << " #ifdef " << PrinterUtils::KLEE_MODE << NL;
436
+ tabsDepth++;
437
+ ss << TAB_N () << " if (" << firstTimeCallVar << " == 1)" << LB ();
438
+ strAssignVar (firstTimeCallVar, " 0" );
439
+ strKleeMakeSymbolic (stubSymbolicVarName, !method.returnType .isArray (),
440
+ stubSymbolicVarName);
441
+ types::TypeMaps tempMap = {};
442
+ auto temp = shared_ptr <types::TypesHandler>(new types::TypesHandler (tempMap, types::TypesHandler::SizeContext ()));
443
+ printer::KleeConstraintsPrinter preferWriter (temp.get (), srcLanguage);
444
+ preferWriter.setTabsDepth (tabsDepth);
445
+ preferWriter.genConstraints (
446
+ {types::Type::createArray (method.returnType ), stubSymbolicVarName, std::nullopt});
447
+ ss << preferWriter.ss .str ();
448
+ ss << RB ();
449
+ tabsDepth--;
450
+ ss << TAB_N () << " #endif" << NL;
451
+
452
+ checkOverflowStubArray (cntCall);
453
+
454
+ returnValue = stubSymbolicVarName + " [" + cntCall + " ++]" ;
431
455
strReturn (returnValue) << RB () << NL;
432
456
return ss;
433
457
}
@@ -552,7 +576,7 @@ namespace printer {
552
576
strTypedefFunctionPointer (*fInfo , typedefName);
553
577
}
554
578
strStubForMethod (tests::Tests::MethodDescription::fromFunctionInfo (*fInfo ), *typesHandler,
555
- stubName, " stub" , false , makeStatic);
579
+ stubName, " stub" , makeStatic);
556
580
}
557
581
558
582
void Printer::genStubForStructFunctionPointer (const string &structName,
0 commit comments