【问题标题】:C low-level validation of function arguments [closed]函数参数的 C 低级验证
【发布时间】:2012-12-06 01:30:14
【问题描述】:

假设我们有一些函数,我们想要验证参数。例如不为 NULL:

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

我的问题是什么叫做良好的低级 (API) 验证,就像标准 C 库所做的那样。

谢谢。

【问题讨论】:

  • C 标准库不保证验证参数。 strcpy(NULL, "abc"); 可能会崩溃。这很好。

标签: c low-level-api


【解决方案1】:

C 是一种你所问的语言,它有很多用来吊死自己的绳索和很少的安全网。以 Apple 的 this implementation of strcpy 为例,但它们看起来都非常相似:

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

由于 C 不知道异常的概念,所有错误信号都必须通过函数的返回值,有时通过全局变量 errno 来完成,这当然在一定程度上限制了错误的表达能力。

因此,如果您想与标准库的功能保持一致,则几乎不需要提供安全性。

【讨论】:

  • 据我了解,在您的示例中,NULL 的验证是功能本身实现的一部分。
  • @Sanich 实际上,调用函数的代码本身负责它发送的参数的正确性。库函数假定它接收到的值是可用的。
【解决方案2】:

关键是“言出必行”和“言出必行”。 “你说什么”需要清楚地描述。描述应该在文档中,但也可以在 cmets 或函数名或参数名中。

在陈述了要求后,请确保您随后满足该要求。如果您定义要捕获的错误情况,请确保调用者可以使用errno 或其他方式确定这一点。

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 2015-02-01
    • 1970-01-01
    • 2010-12-27
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多