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.
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优化了第二个参数的空字符串的情况。未定义的行为是不需要检测或诊断的错误;作为程序员,首先避免未定义的行为完全是您的责任。
| 归档时间: |
|
| 查看次数: |
6958 次 |
| 最近记录: |