1

だから私のコードは

#include <stdio.h>
#include <string.h>
int main()
{
    const char *a="123456789abcdef";
    char b[10];
    int i=0;
    while((b[i]=a[i])!='\0')
        ++i;
    printf("%s, %d\n",b,strlen(b));
    return 0;
}

コードには配列 b の配列オーバーフローが存在しますが、私のシステム (64 ビット ubuntu 12.04 lts) で gcc (バージョン 4.6.3) を使用してコンパイルすると、成功します。

このプログラムの出力は123456789abcdef, 15で、
戻り値 0 はこのプログラムが正常に終了したことを意味します。

コンパイラの問題なのか、システムの問題なのかわかりません。誰か教えてもらえますか? PS gcc を使用する 64 ビット Linux でのみ表示されるようです。これはバグですか?

4

1 に答える 1

7

配列アクセスは C ではチェックされません。このようにバッファをオーバーフローさせると、結果は未定義の動作になります。これを防ぐのはプログラマーの責任であり、コンパイラーの責任ではありません。

ただし、無効なメモリアクセスのチェックを支援するツールがあります。実行時にこれを行うための Valgrind や、コンパイル時のチェックのための Clang の静的アナライザーのように。

于 2013-01-19T09:07:06.603 に答える