6
#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しましたが、役に立ちません。

4

2 に答える 2

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

于 2013-05-03T10:09:00.070 に答える
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);
于 2013-05-03T10:14:02.920 に答える