NULL参数对strstr的行为是什么?

Tho*_*ews 6 c strstr language-lawyer

将NULL作为参数传递时的行为是strstr什么?

鉴于:

char * p = NULL;
char * s = NULL;
Run Code Online (Sandbox Code Playgroud)

情况1: strstr(p, "Hello");

案例2: strstr("With my dog", p);

案例3: strstr(p, s);

我的理解是行为未定义,并留给所有3个案例的实施.

根据Microsoft Visual Studio文档,他们执行参数验证并在那里处理它. 请参阅备注部分.

我们在IAR Workbench上使用C99.

背景:一些测试人员正在编写单元测试并为字符串变量分配NULL.

Kei*_*son 6

ISO C 标准表示该行为未定义。

引用N1570,它是 2011 年 ISO C 标准的草案,第 7.1.4 节:

除非在后面的详细描述中另有明确说明,否则以下每个语句都适用: 如果函数的参数具有无效值(例如[...]或空指针[...] ),则行为为不明确的。

7.24.5.7中的描述strstr说:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的系统(Linux、gcc 4.7.2、glibc 2.15)上编译并运行时打印:

p == NULL
Run Code Online (Sandbox Code Playgroud)

可能是因为strstr优化了第二个参数的空字符串的情况。未定义的行为是不需要检测或诊断的错误;作为程序员,首先避免未定义的行为完全是您的责任。