在strstr中将NULL作为参数传递时的行为是什么?
给予:
char * p = NULL;
char * s = NULL;案例1:strstr(p, "Hello");
案例2:strstr("With my dog", p);
案例3:strstr(p, s);
我的理解是,这种行为是未定义的,并留给所有3种情况下的实现。
根据Microsoft文档,他们执行参数验证并在那里处理它。见备注部分。
我们在上使用C99。
背景:一些测试人员正在编写单元测试,并将NULL赋值给字符串变量。
发布于 2013-10-25 01:57:42
ISO C标准说,这种行为是未定义的。
引用作为2011年国际标准化组织标准草案的N1570,第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为第二个参数优化了空字符串的情况。未定义的行为是不需要检测或诊断的错误;首先,避免未定义的行为完全是程序员的责任。
发布于 2013-10-25 01:32:37
对于未定义的行为,您几乎可以预料到崩溃。
MSFT表示,对于strstr参数:“如果str或strSearch为NULL,则调用无效的参数处理程序”和“默认无效参数调用沃森崩溃报告,这将导致应用程序崩溃”(http://msdn.microsoft.com/en-us/library/vstudio/ksazx244.aspx)。
但是,您可以通过使用函数_set_invalid_parameter_handler来改变这一点(至少在MSFT中是这样)。当调用该函数时,您必须决定如何恢复,以及是否应该通知用户,或者程序是否可以继续。
https://stackoverflow.com/questions/19579574
复制相似问题