C中整数参数的验证

validation of an integer parameter in C

有人告诉我,带参数的函数的最佳实践之一是执行参数验证。
因此,对于字符串检查 null 或空等等。

我正在创建一个列表并为此创建一个接受整数值的节点。我正在检查 INT_MININT_MAX 的值,但从我读到的 int 值总是介于两者之间。如果我传递一个 long long val,在带有 signature node* create(int val) 的被调用函数中 - 值将转换为 int 范围并落入范围内。

问题:如果正在传递 long 的 val,有没有办法检测到它而不让创建节点​​?目前它被创建

问题:对于标准 int,我还需要执行哪些参数检查才能编写健壮的代码?

我的代码片段

long long vall = 88888888888888; 
create(vall);     // for such case I don't want node to be created

node* create(int val)
{
    if (val <= INT_MIN || val >= INT_MAX)
    {
        printf(" values are out of range");
    }
    node *pnode = (node *)malloc(sizeof(node));
    if(pnode == NULL)
    {
        printf(" node creation failed \n");
    }

    pnode->pnext = NULL;
    pnode->val = val;

    return pnode;
}

if val of long is being passed, is there a way to detect it and not let the node be created ?

将函数签名更改为 longlong long

// declare/define function first
node* create(long long val);

long long vall = 88888888888888; 
create(vall);     // for such case I don't want node to be created

node* create(long long val) {
    // if (val <= INT_MIN || val >= INT_MAX) {
    if (val < INT_MIN || val > INT_MAX) {
        fprintf(stderr, " %lld out of int range\n", val);

        return NULL;
        // Return or exit, do not continue with the following code 
    }

    // node *pnode = (node *)malloc(sizeof(node));
    // Suggest alternative
    node *pnode = malloc(sizeof *pnode);
    ...
    // Adding an explicit cast useful to quiet pedantic warnings
    pnode->val = (int) val;
    ...

注意:使用原始代码,许多启用了所有警告的编译器将警告以下(不知道 vall 的值)作为范围缩小。

node* create(int val)
long long vall = ...; 
create(vall);

for a standard int what else checking of parameter do I need to perform to write a robust code ?

没什么,除非函数只能使用int的一个子范围。所有 int 值都在 [INT_MIN ... IN_MAX] 范围内。

您可以再创建一个具有相同名称但参数列表不同的函数:

node* create(long long val);

如果您传递 long long 类型的值,此函数将 运行 而不是 node* create(int val);。因此,当您将 long 作为参数传递时,您可以通过创建另一个函数来处理这种情况。

关于你的第二个问题,我应该说,你不需要根据 INT_MININT_MAX 边界检查你的 int 值,因为 它永远不会超出这些界限。 INT_MAXINT_MINint 类型本身的实际边界。

根据您的需求(功能需求)检查您的 int 值。

您需要检查 NULL 传递的字符串,因为如果您尝试访问此类字符串,您的程序将会崩溃。但是当你传递一个 int 值时,它 无论如何都会有一个赋值。