本当に興味のある大規模なプログラムには対応していないかもしれませんが、Frama-Cでこのエラーを見つけることができます:
$ frama-c -cpp-command "gcc -C -E -I`frama-c -print-share-path`/libc/ -nostdinc" mem.c `frama-c -print-share-path`/libc/fc_runtime.c -val
...
[value] computing for function memcpy <- main.
Called from mem.c:13.
.../libc/string.h:54:[value] Function memcpy: precondition got status invalid.
memcpy()
このメッセージは、契約を満たさない引数で呼び出していることを意味します。この場合、失敗する前提条件は、書き込み先の有効性に関するリストの最初の条件です。
/*@ requires \valid(((char*)dest)+(0..n - 1));
@ requires \valid_read(((char*)src)+(0..n - 1));
@ requires \separated(((char *)dest)+(0..n-1),((char *)src)+(0..n-1));
@ assigns ((char*)dest)[0..n - 1] \from ((char*)src)[0..n-1];
@ assigns \result \from dest;
@ ensures memcmp((char*)dest,(char*)src,n) == 0;
@ ensures \result == dest;
@*/
extern void *memcpy(void *restrict dest,
const void *restrict src, size_t n);