3 # Test script to verify ACSL contracts using Frama-C for a single file
4 # Usage: ./test_frama_c_single.sh <filename>
7 echo "Usage: $0 <filename>"
8 echo "Example: $0 find1.c"
13 BASENAME=$(basename "$FILENAME" .c)
15 echo "Running Frama-C verification on $FILENAME..."
17 # Set opam environment for proper tool paths
20 # Run frama-c with WP (weakest precondition) plugin to prove contracts using Coq
21 FRAMA_OUTPUT=$(frama-c -wp -wp-rte -wp-prover coq -wp-timeout 30 -wp-cache rebuild -verbose 2 -wp-verbose 3 -wp-debug 1 -wp-proof-trace -cpp-extra-args="-I../inc" "../src/$FILENAME" 2>&1)
26 # Check for complete verification (no failures, timeouts, or unknowns)
27 if [ $FRAMA_EXIT -ne 0 ]; then
28 echo "✗ Frama-C execution failed for $BASENAME"
30 elif echo "$FRAMA_OUTPUT" | grep -q "\[Failure\]"; then
31 echo "✗ Frama-C verification incomplete - some proof goals failed for $BASENAME"
33 elif echo "$FRAMA_OUTPUT" | grep -q "\[Timeout\]"; then
34 echo "✗ Frama-C verification incomplete - some proof goals timed out for $BASENAME"
36 elif echo "$FRAMA_OUTPUT" | grep -q "Unknown:"; then
37 echo "✗ Frama-C verification incomplete - some proof goals remain unknown for $BASENAME"
40 echo "✓ All ACSL contracts verified successfully for $BASENAME"