Skip to content

Commit 7d4e004

Browse files
author
Daniel Kroening
committed
make bmc_cover work, and test it
1 parent 471a7a0 commit 7d4e004

File tree

11 files changed

+144
-14
lines changed

11 files changed

+144
-14
lines changed

regression/cbmc-cover/Makefile

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
default: tests.log
2+
3+
test:
4+
@if ! ../test.pl -c ../../../src/cbmc/cbmc ; then \
5+
../failed-tests-printer.pl ; \
6+
exit 1 ; \
7+
fi
8+
9+
tests.log: ../test.pl
10+
@if ! ../test.pl -c ../../../src/cbmc/cbmc ; then \
11+
../failed-tests-printer.pl ; \
12+
exit 1 ; \
13+
fi
14+
15+
show:
16+
@for dir in *; do \
17+
if [ -d "$$dir" ]; then \
18+
vim -o "$$dir/*.c" "$$dir/*.out"; \
19+
fi; \
20+
done;

regression/cbmc-cover/branch1/main.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
int main()
2+
{
3+
int input1, input2;
4+
5+
if(input1)
6+
{
7+
if(input1) // dependent
8+
{
9+
}
10+
}
11+
else
12+
{
13+
if(input2) // independent
14+
{
15+
}
16+
}
17+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CORE
2+
main.c
3+
--cover branch
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^\[main.1\] file main.c line 5 function main function main block 1 branch false: SATISFIED$
7+
^\[main.2\] file main.c line 5 function main function main block 1 branch true: SATISFIED$
8+
^\[main.3\] file main.c line 7 function main function main block 2 branch false: FAILED$
9+
^\[main.4\] file main.c line 7 function main function main block 2 branch true: SATISFIED$
10+
^\[main.5\] file main.c line 13 function main function main block 4 branch false: SATISFIED$
11+
^\[main.6\] file main.c line 13 function main function main block 4 branch true: SATISFIED$
12+
--
13+
^warning: ignoring
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
int main()
2+
{
3+
int input1, input2;
4+
5+
if(input1 && input2)
6+
{
7+
}
8+
else if(input1)
9+
{
10+
}
11+
else if(input2)
12+
{
13+
if(input1) // can't be true
14+
{
15+
}
16+
}
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
CORE
2+
main.c
3+
--cover condition
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^\[main.1] file main.c line 5 function main condition .* false: SATISFIED
7+
^\[main.2] file main.c line 5 function main condition .* true: SATISFIED
8+
^\[main.3] file main.c line 5 function main condition .* false: SATISFIED
9+
^\[main.4] file main.c line 5 function main condition .* true: SATISFIED
10+
^\[main.5] file main.c line 8 function main condition .* false: SATISFIED
11+
^\[main.6] file main.c line 8 function main condition .* true: SATISFIED
12+
^\[main.7] file main.c line 11 function main condition .* false: SATISFIED
13+
^\[main.8] file main.c line 11 function main condition .* true: SATISFIED
14+
^\[main.9] file main.c line 13 function main condition .* false: FAILED
15+
^\[main.10] file main.c line 13 function main condition .* true: SATISFIED
16+
^\*\* 9 of 10 covered (90.0%)
17+
--
18+
^warning: ignoring
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
int main()
2+
{
3+
int input1, input2, input3;
4+
5+
if(input1 && input2 && input3)
6+
{
7+
}
8+
else
9+
{
10+
}
11+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
main.c
3+
--cover decision
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^\*\* 2 of 2 covered (100.0%), using 2 iterations$
7+
--
8+
^warning: ignoring
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
int main()
2+
{
3+
int input1;
4+
int x=0;
5+
6+
if(input1)
7+
{
8+
x=1;
9+
}
10+
11+
if(input1 && !x)
12+
{
13+
x=2; // I am dead!
14+
}
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CORE
2+
main.c
3+
--cover location
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^\[main.1\] file main.c line 3 function main block 1: SATISFIED$
7+
^\[main.2\] file main.c line 8 function main block 2: SATISFIED$
8+
^\[main.3\] file main.c line 11 function main block 3: SATISFIED$
9+
^\[main.4\] file main.c line 13 function main block 4: FAILED$
10+
^\[main.5\] file main.c line 15 function main block 5: SATISFIED$
11+
^\*\* 4 of 5 covered (80.0%)
12+
--
13+
^warning: ignoring

src/cbmc/bmc_cover.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -272,33 +272,33 @@ bool bmc_covert::operator()()
272272
i_it->source_location);
273273
}
274274
}
275+
276+
for(symex_target_equationt::SSA_stepst::iterator
277+
it=bmc.equation.SSA_steps.begin();
278+
it!=bmc.equation.SSA_steps.end();
279+
it++)
280+
it->cond_literal=literalt(0, 0);
275281

276282
// Do conversion to next solver layer
277283

278284
bmc.do_conversion();
279285

280286
//bmc.equation.output(std::cout);
281287

282-
// collects assumptions
283-
and_exprt::operandst assumptions;
284-
285288
// get the conditions for these goals from formula
286289
// collect all 'instances' of the goals
287290
for(symex_target_equationt::SSA_stepst::iterator
288291
it=bmc.equation.SSA_steps.begin();
289292
it!=bmc.equation.SSA_steps.end();
290293
it++)
291294
{
292-
if(it->is_assume())
293-
assumptions.push_back(literal_exprt(it->cond_literal));
294-
295-
if(it->source.pc->is_assert())
295+
if(it->is_assert())
296296
{
297+
assert(it->source.pc->is_assert());
297298
exprt c=
298299
conjunction({
299-
conjunction(assumptions),
300300
literal_exprt(it->guard_literal),
301-
literal_exprt(it->cond_literal) });
301+
literal_exprt(!it->cond_literal) });
302302
literalt l_c=solver.convert(c);
303303
goal_map[id(it->source.pc)].add_instance(it, l_c);
304304
}

src/goto-instrument/cover.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,7 @@ void instrument_cover_goals(
301301
if(!source_location.get_file().empty() &&
302302
source_location.get_file()[0]!='<')
303303
{
304-
std::string comment=
305-
"block "+i2string(i_it->location_number);
306-
304+
std::string comment="block "+b;
307305
goto_program.insert_before_swap(i_it);
308306
i_it->make_assertion(false_exprt());
309307
i_it->source_location=source_location;
@@ -328,12 +326,12 @@ void instrument_cover_goals(
328326
source_locationt source_location=i_it->source_location;
329327

330328
goto_program.insert_before_swap(i_it);
331-
i_it->make_assertion(guard);
329+
i_it->make_assertion(not_exprt(guard));
332330
i_it->source_location=source_location;
333331
i_it->source_location.set_comment(true_comment);
334332

335333
goto_program.insert_before_swap(i_it);
336-
i_it->make_assertion(not_exprt(guard));
334+
i_it->make_assertion(guard);
337335
i_it->source_location=source_location;
338336
i_it->source_location.set_comment(false_comment);
339337

0 commit comments

Comments
 (0)