-2

これが私のコードです:

#include <iostream>
#include <assert.h>
using namespace std;

char * my_strcpy(char *dst,const char *src)
{
    assert(dst != NULL);
    assert(src != NULL);
    char *ret = dst;
    while((* dst++ = * src++) != '\0');
    return ret;
}

int main()
{
    char str[4]="abc";
    cout<<str<<endl;
    strcpy(str+1,str); //works, "aabc" will be in it, \0 is out of its range
    cout<<str<<endl;
    my_strcpy(str+1,str); //an error will be occured here as expected
    cout<<str<<endl;
    return 0; 
} 

私の質問は、Microsoft の strcpy がオーバーラップ コピーをサポートし、strcpy がオーバーラップ シナリオをサポートしていないと宣言された C++ 標準ライブラリが潜在的なリーク リスクをもたらすのはなぜですか? このデザインの利点はありますか?

ありがとう!

4

2 に答える 2

2

Microsoft の開発者は、チェックを挿入しないことに決めただけだと思います。標準では、ユーザーが重複コピーを試みたときに中止する必要があるとは述べていません。これは、チェックを行わない方が安上がりであることを意味するため、チェックは行われません。

C 標準ライブラリは、他の何よりもパフォーマンスを優先することがよくあります...

ただし、実行時チェックを有効にしてプログラムをコンパイルすることもできます。これにより、追加の前提条件チェックが標準ライブラリ関数とデータ構造に挿入され、そのような問題が検出される場合があります。

この MSDN の記事も参照してください: Safe Libraries: Standard C++ Library

于 2013-10-21T08:32:44.183 に答える