总结:
C语言中的函数是否应该始终检查以确保未取消引用NULL
指针?如果不是,何时跳过这些检查是否合适?
详细资料:
我读过一些有关编程面试的书,我想知道在C语言中对函数参数进行输入验证的适当程度是多少?显然,任何需要用户输入的功能都需要执行验证,包括NULL
在取消引用指针之前检查指针。但是,如果您不希望通过API公开同一文件中的函数,该怎么办?
例如,以下内容出现在git的源代码中:
static unsigned short graph_get_current_column_color(const struct git_graph *graph)
{
if (!want_color(graph->revs->diffopt.use_color))
return column_colors_max;
return graph->default_column_color;
}
如果*graph
为,NULL
则将取消引用空指针,这可能会使程序崩溃,但可能导致某些其他不可预测的行为。另一方面,函数是static
,因此程序员可能已经验证了输入。我不知道,我只是随机选择了它,因为它是用C编写的应用程序中的一个简短示例。我已经看到许多其他地方使用了指针而不检查NULL。我的问题不是针对此代码段的。
我在异常处理的上下文中看到了一个类似的问题。但是,对于不安全的语言(例如C或C ++),不会自动传播未处理的异常。
另一方面,我在开放源代码项目(例如上面的示例)中看到了很多代码,这些代码在使用它们之前不做任何指针检查。我想知道是否有人对何时将检查放入函数与是否假定使用正确参数调用函数的准则进行了思考。
对于编写生产代码,我通常对此问题感兴趣。但是我也对编程面试感兴趣。例如,许多算法教科书(例如CLR)倾向于以伪代码表示算法,而没有任何错误检查。但是,尽管这对于理解算法的核心很有帮助,但显然不是一种好的编程实践。因此,我不想告诉采访者我正在跳过错误检查以简化代码示例(就像教科书一样)。但是我也不想出现带有过多错误检查的低效率代码。例如,graph_get_current_column_color
可以将其修改为检查*graph
空值,但不清楚是否*graph
为空值,除非不取消引用它。