The logic function \strlen is currently not supported by the Frama-C implementation. If you download the ACSL 1.9 (Sodium implementation) manual, you will see that the definition is in red, meaning it is not supported.
Instead, you can try replacing \strlen by the function strlen, whose axiomatic definition is given in the file libc/__fc_string_axiomatic.h of your Frama-C installation. To do so, make sure to add #include <string.h> at the beginning of your example. (string.h automatically includes __fc_string_axiomatic.h)
I reproduce below the beginning of the axiomatic block StrLen that defines strlen:
@ axiomatic StrLen {
@ logic ℤ strlen{L}(char *s);
@ // reads s[0..];
@
@ axiom strlen_pos_or_null{L}:
@ \forall char* s; \forall ℤ i;
@ (0 <= i
@ && (\forall ℤ j; 0 <= j < i ==> s[j] != '\0')
@ && s[i] == '\0') ==> strlen(s) == i;
@
@ axiom strlen_neg{L}:
@ \forall char* s;
@ (\forall ℤ i; 0 <= i ==> s[i] != '\0')
@ ==> strlen(s) < 0;
Most of the definitions of the file __fc_string_axiomatic.h were originally written for Jessie, so you should be able to prove your specification of strcpy -- if you provide a loop invariant that is strong enough.
You may also be interested in the document ACSL by example, that specifies and proves some common functions.
char *strcpy()? The function returns the pointer you passed for*dest. - Weather Vane\strlenusing a\forallquantification over all the characters after the pointer argument. - byako