3

私は最近、C の大学のコースを修了しました。したがって、もちろん経験が不足しています。

一部の大学は、学生に安全なプログラミング、または少なくともいくつかの要素を教える傾向があります。動画もあります(こちらからどうぞ)。

Cで文字列をコピーするには、私が知る限り、strcpyまたはstring.h関数が必要です。日常のプログラミングでどのように安全に使用しますか? バッファオーバーフローを防ぐために割り当てを処理する関数はありますか? Cの CERT セキュア コーディング標準があります。例と準拠ソリューションを提供しています。

int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[128];
  strcpy(prog_name, argv[0]);
  /* ... */
}

そして、それらの代替手段は次のとおりです。

int main(int argc, char *argv[]) {
  /* ... */
  char *prog_name = (char *)malloc(strlen(argv[0])+1);
  if (prog_name != NULL) {
    strcpy(prog_name, argv[0]);
  }
  else {
    /* Couldn't get the memory - recover */
  }
  /* ... */
}

here から取得、2番目の例

しかし、私が知る限り、それはより挑戦的で、より多くのコードとより多くの作業です。なぜ誰もライブラリ自体を変更しないのですか? または、少なくとも、これを適切な方法で処理する安全な代替ライブラリまたは関数を誰も提供しないのはなぜですか?

読んでくれてありがとう、ウィシ

4

7 に答える 7

9

このためのPosix関数(ほぼすべてのシステムで使用可能)はstrdup()です。strcpy()新しいメモリを割り当てたくなく、使用したいバッファがすでにある場合に使用されますが、そのバッファの大きさと文字列がそれに収まるかどうかがよくわかります。文字列が収まるかどうかわからない場合はstrncpy()、指定された数の文字をコピーするだけです。したがって、コピーする量をバッファサイズに制限できます。

それに加えて、さまざまな方法で文字列サイズを管理する多くのstingライブラリがあります。

そして、あなたがそれにタグを付けたので、C ++:それはstd::stringあなたのためにすべてのメモリ管理を行い、あなたにこれらの問題を与えません。

于 2009-01-27T11:25:55.243 に答える
2

使用strncpy

#define BUFSIZE 127
int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[BUFSIZE + 1];
  strncpy(prog_name, argv[0], BUFSIZE);
  progname[BUFSIZE]= '\0';
  /* ... */
}

ほとんどの機能には*n*バージョンがありstr*ます。

于 2009-01-27T11:27:24.320 に答える
2

通常、 OpenBSDl (strlcpy、strlcat) 関数はn関数よりも優れており、より高速で安全に使用できますが、非標準です。ただし、これらは BSD ライセンスであるため、既知の適切な実装を任意のプログラムに含めることができるため、クロス プラットフォームと安全の両方を実現できます。

Windows の場合、移植性を気にしない場合は、*_s 関数を使用できます。

于 2009-01-27T13:27:22.237 に答える
1

私の理解が正しければ、あなたの本当の質問は、API 関数がより安全にされていない理由です。

理由の 1 つは、C ライブラリがレガシーであることです (今変更するには遅すぎます)。

ただし、主な理由は、ライブラリが最小限に抑えられるように設計されているため、最小限の機能を実行し、正しく呼び出されることを確認するのはユーザーの責任です。過剰なチェックを行っていた場合、ユーザーが他の理由で問題が発生しないことを保証できたとしても、呼び出されるたびに料金が支払われます。これは、多くの API で非常に一般的です。

そうは言っても、より安全な代替手段を提供するライブラリは十分にありますが、それらは標準ライブラリの一部ではありません。また、より高度な作業を行う多くの人々は、それらの多くの標準クラス ライブラリを備えた C++ を使用しています。

于 2009-01-29T00:02:09.397 に答える
0

たぶん、あなたはこの質問への有用な読書の答えを見つけるでしょう

于 2009-01-28T23:45:54.283 に答える
0

実際、Microsoft は CRT 機能の安全な代替手段を提供していました。私が知っている誰もがそれらを嫌い、古い機能を使用すべきではないという警告を無効にします。安全なものが必要な場合は、C++ を使用する必要があります。そして、STL 文字列または Qt のようなものです。

または、.NET や Java などのプラットフォームに移動すると、通常はこれらの問題に悩まされることはありません (アプリがクラッシュする可能性はありますが、バッファー オーバーフローによってアプリにコードを挿入する方法はありません)。

編集: データ実行防止/NX が有効になっている場合 (Vista および .NET のデフォルト)、これは従来のプラットフォームでも問題になりません。

于 2009-01-27T11:19:32.010 に答える
0
int main
(
    int argc, 
    char *argV[]
) 
{
   char prog_name[128];
   if (strlen(argV[0]) < sizeof(prog_name))
   {
       strcpy(prog_name, argV[0]);
   }
   else
   {
       printf("%s is too large for the internal buffer\n", argV[0]);
   }

   return 0;
}
于 2009-01-27T15:09:45.510 に答える