#include <stdio.h>
#include <string.h>
int main()
{
char arrDst[5] = {0};
char arrSrc[10] = "123456";
memcpy( arrDst, arrSrc, sizeof( arrSrc ) );
return 0;
}
这个程序很明显存在内存损坏。
gcc编译器中是否有任何选项可以在编译时识别出这个问题?
注意:我使用了valgrind --leak-check=full
,但没有帮助。
答案 0 :(得分:7)
$ gcc -Wall -O1 t.c
In file included from /usr/include/string.h:642:0,
from t.c:3:
In function ‘memcpy’,
inlined from ‘main’ at t.c:13:9:
/usr/include/bits/string3.h:52:3: warning: call to __builtin___memcpy_chk
will always overflow destination buffer [enabled by default]
GCC可以识别一些。这通常需要启用优化(至少-01
)和警告(-Wall
,同时添加-Wextra
)。
答案 1 :(得分:2)
它可能无法扩展到您真正感兴趣的大型程序,但您可以使用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);