将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。
答案 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世界中)更改此设置。调用该函数时,您必须决定如何恢复以及是否应该通知用户或程序是否可以继续。