私の理解では、strcmp()
('n'なし)は、いずれかの引数にnull文字が含まれていると、すぐに処理を停止して結果を返します。
したがって、引数の1つが100%確実にnullで終了することがわかっている場合(たとえば、文字列リテラルである場合)、3番目の一部としてstrncmp()
の呼び出しで(「n」を使用して)使用してもセキュリティ上の利点はありません。strlen()
既知の文字列の長さに比較を制限する引数。これstrcmp()
は、既知の終了文字列よりも多くの文字を読み取ることはないためです。
実際、最初の2つの引数のいずれかstrncmp()
で長さ引数がaである呼び出しは、式を評価することによって既知の終了文字列のサイズで線形の時間を浪費するというstrlen()
点でのみ異なるように思われます。strcmp()
strlen()
検討:
サンプルコードA:
if (strcmp(user_input, "status") == 0)
reply_with_status();
サンプルコードB:
if (strncmp(user_input, "status", strlen("status")+1) == 0)
reply_with_status();
前者には後者よりもメリットがありますか?他の人のコードでよく見かけるからです。
これらの機能がどのように機能するかについての理解に欠陥がありますか?