2012-12-06 47 views
-1

假设我们有一些函数,并且想验证参数。例如,对于不是NULL:C函数参数的低级验证

void* myFunction(char* str1, char* str2){ 
    if(str1==NULL || str2==NULL) return NULL; 
    ... 
} 

我的问题是什么,它被称为良好的低级别(API)来验证就像是用标准C库做。

谢谢。

+1

C标准库不保证验证参数。 'strcpy(NULL,“abc”);'可能会崩溃。这可以。 –

+0

为什么不能assert()? – Mawg

回答

1

C是一个你问的是什么你得到的语言有很多绳子挂自己和很少的安全网。举个例子this implementation of strcpy从苹果公司,但他们都看上去很相像:

char *strcpy(char *s1, const char *s2) 
{ 
    char *s = s1; 
    while ((*s++ = *s2++) != 0) 
    ; 
    return (s1); 
} 

由于C不知道异常的概念,所有的错误信号,必须通过通过功能有时的返回值进行全局变量errno,这当然在某种程度上限制了错误的表达性。

因此,如果你想保持标准库的功能,就不需要提供很少的安全性。

+0

据我所知,在你的例子中,NULL的验证是作为功能本身实现的一部分。 – Sanich

+0

@Sanich确实,调用该函数的代码本身负责其发送的参数的正确性。库函数假定它接收的值是可用的。 – fvu

0

关键是要“做你说的话”和“说出你的所作所为”。 “你说什么”需要清楚描述。描述应该在文档中,但也可以在注释或函数名称或参数名称中。

说明了这个要求后,确定你确实满足了这个要求。如果您定义错误情况进行陷阱,请确保调用方可以使用errno或其他方式确定此情况。