ISO C 標準では、動作は未定義であると規定されています。
2011 ISO C 標準のセクション 7.1.4 のドラフトであるN1570を引用します。
以下の詳細な説明で特に明記されていない限り、次の各ステートメントが適用されます。未定義。
strstr
7.24.5.7の説明には次のように書かれています。
strstr関数は、 s2 が指す文字列内の一連の文字 (終端のヌル文字を除く) が、 s1 が指す文字列内で最初に出現する位置を特定します。
これは、7.1.4 のステートメントに加えて、引数が何らかの文字列を指す必要があることを示しています (ヌル ポインターはそうではありません)。
これらのステートメントは、C90 および C99 標準で、同一ではないにしても類似しています。
「未定義の動作」は、プログラムが必ずクラッシュすることを意味するものではないことに注意してください。たとえば、このプログラム:
#include <stdio.h>
#include <string.h>
int main(void) {
char *p = strstr(NULL, "");
if (p == NULL) {
printf("p == NULL\n");
}
else {
printf("p = %p\n", p);
}
}
私のシステム(Linux、gcc 4.7.2、glibc 2.15)でコンパイルして実行すると、次のように出力されます。
p == NULL
おそらくstrstr
、2 番目の引数の空の文字列の大文字と小文字を最適化するためです。未定義の動作は、検出または診断する必要のないエラーです。そもそも未定義の動作を回避するのは、プログラマーとしてのあなたの責任です。