@@ -255,6 +255,13 @@ cl::opt<unsigned> DelayCoverOnTheFly(
255
255
" (default=10000)" ),
256
256
cl::cat(TestGenCat));
257
257
258
+ cl::opt<unsigned > UninitMemoryTestMultiplier (
259
+ " uninit-memory-test-multiplier" , cl::init(6 ),
260
+ cl::desc(" Generate additional number of duplicate tests due to "
261
+ " irreproducibility of uninitialized memory "
262
+ " (default=6)" ),
263
+ cl::cat(TestGenCat));
264
+
258
265
/* Constraint solving options */
259
266
260
267
cl::opt<unsigned > MaxSymArraySize (
@@ -7122,6 +7129,15 @@ bool isReproducible(const klee::Symbolic &symb) {
7122
7129
return !bad;
7123
7130
}
7124
7131
7132
+ bool isUninitialized (const klee::Array *array) {
7133
+ bool bad = isa<UninitializedSource>(array->source );
7134
+ if (bad)
7135
+ klee_warning_once (array->source .get (),
7136
+ " A uninitialized array %s reaches a test" ,
7137
+ array->getIdentifier ().c_str ());
7138
+ return bad;
7139
+ }
7140
+
7125
7141
bool Executor::getSymbolicSolution (const ExecutionState &state, KTest &res) {
7126
7142
solver->setTimeout (coreSolverTimeout);
7127
7143
@@ -7158,6 +7174,13 @@ bool Executor::getSymbolicSolution(const ExecutionState &state, KTest &res) {
7158
7174
}
7159
7175
}
7160
7176
7177
+ std::vector<const Array *> allObjects;
7178
+ findSymbolicObjects (state.constraints .cs ().cs ().begin (),
7179
+ state.constraints .cs ().cs ().end (), allObjects);
7180
+ std::vector<const Array *> uninitObjects;
7181
+ std::copy_if (allObjects.begin (), allObjects.end (),
7182
+ std::back_inserter (uninitObjects), isUninitialized);
7183
+
7161
7184
std::vector<klee::Symbolic> symbolics;
7162
7185
std::copy_if (state.symbolics .begin (), state.symbolics .end (),
7163
7186
std::back_inserter (symbolics), isReproducible);
@@ -7180,6 +7203,7 @@ bool Executor::getSymbolicSolution(const ExecutionState &state, KTest &res) {
7180
7203
7181
7204
res.numObjects = symbolics.size ();
7182
7205
res.objects = new KTestObject[res.numObjects ];
7206
+ res.uninitCoeff = uninitObjects.empty () ? 0 : UninitMemoryTestMultiplier;
7183
7207
7184
7208
{
7185
7209
size_t i = 0 ;
0 commit comments