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

时间:2013-10-25 01:24:22

标签: c language-lawyer strstr

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

鉴于:

char * p = NULL;
char * s = NULL;

案例1:strstr(p, "Hello");

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

案例3:strstr(p, s);

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

根据Microsoft Visual Studio文档,他们执行参数验证并在那里处理它。 See Remarks section.

我们在IAR Workbench上使用C99。

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

2 个答案:

答案 0 :(得分:4)

ISO C标准规定行为未定义。

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

  

除非明确说明,否则以下每个陈述均适用   否则在下面的详细描述中:如果参数为   函数具有无效值(例如 [...] ,   或者空指针 [...] ,行为未定义。

7.24.5.7中的strstr说明:

  

strstr 函数定位字符串中的第一个匹配项   由 s1 指出的字符序列(不包括   在 s2 指向的字符串中终止空字符。

除了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优化了第二个参数的空字符串的大小写。未定义的行为是一个无需检测或诊断的错误;作为程序员,完全有责任首先避免未定义的行为。

答案 1 :(得分:1)

你几乎可以期待未定义行为的崩溃。

MSFT文档说明strstr参数:'如果str或strSearch为NULL,则调用无效参数处理程序'和',默认无效参数调用Watson崩溃报告,导致应用程序崩溃' (http://msdn.microsoft.com/en-us/library/vstudio/ksazx244.aspx)。

您可以使用函数_set_invalid_parameter_handler(至少在MSFT世界中)更改此设置。调用该函数时,您必须决定如何恢复以及是否应该通知用户或程序是否可以继续。