iPhone の開発はstrncpy()
安全ですか?
そうでない場合、安全であることが推奨されている、使用するのに適した String API は何ですか?
の制限を知っているならstrncpy()
、それはOKです。2つある制限が気に入らないので避けます。
これは、次のように書くと次のことを意味します。
char little[10];
char large[20480];
strncpy(little, sizeof(little), "abcdefghijklmnopqrstuvwxyz");
strncpy(large, sizeof(large), "abcdefghijklmnopqrstuvwxyz");
次にlittle
、バッファオーバーフローは発生しておらず、largeでは20454個のnullが末尾にコピーされていますが、nullで終了する文字列ではありません。どちらも面倒です。
strlcpy()
とstrlcat()
がiOSで利用可能かどうかを検討します。それらはMacOSX上にあります。C ++でコーディングしている場合は、C文字列をまったく使用しないか、システムサービスで使用する必要がある最も限られた状況でのみ使用する必要があります。次に、C ++文字列を受け取るカバー関数(インライン)が必要です。somestring.c_str()
値をシステムサービスに渡します。
Objective-Cでコーディングしている場合は、NS*文字列を使用します。
したがって、strncpy()
Cでコーディングしている場合にのみ考慮してください。それでも注意して扱ってください。
私は論文を持っています(そして私はその中に新規性を主張しません—私は他の人からアイデアを集めました):
strcpy()
の関数を安全に使用できるのは、ターゲットバッファとソース文字列の両方の文字列の長さがわかっている場合のみです(そして、呼び出している関数のfoiblesがわかっている場合、すばやく、渡される長さは何を表しますか) ?(1))。strncpy()
strcat()
strncat()
strncat()
strcpy()
;のような関数を使用する必要はありません。memmove()
(または)を使用できますmemcpy()
。(1)長さは、現在の文字列が考慮された後、ターゲットバッファで使用可能なスペースです。したがって、を使用できるようにするstrncat()
には、文字列がターゲット文字列に含まれる長さと使用可能な全長を知っている必要があります。これstrncat()
により、文字列の最初のセグメントをスキップして、2番目の文字列の一部またはすべてを連結できます。 。しかし、あなたがそれを知っているなら、あなたは以下を使うことができたでしょう:
strncpy(target + curr_target_strlen, source, target_size - curr_target_strlen);
これは、文字列の先頭部分をスキップする必要がないため、「より効率的」です(ちなみに、多くのstrncat()
またはstrcat()
操作を含む長い文字列を作成している場合は、2次動作につながる可能性があります)。または、すべてのサイズを知っている場合は、次を使用できますmemmove()
。
size_t copy_length = target_size - curr_target_strlen;
if (copy_length > source_strlen)
copy_length = source_strlen + 1;
memmove(target + curr_target_strlen, source, copy_length);
そして、その瞬間に書かれたコードで1つずつエラーが発生しない限り、。の問題のほとんどを回避できstrncat()
ます。文字列の最後にあるnullを指す最初の引数を常に使用する場合strncat()
は、その用途があります(また、アセンブラで最適化される場合があります。それ以外の場合は、適切な選択ではありません—IMNSHO。
安全とはどういう意味かを指定してください。いずれの場合もstrncpy
、iPhoneは他のすべてのプラットフォームと同じくらい安全です。
必要なので、sを使用していstrncpy
ないと思いますNSString
ので、使用しても問題はありません。