验证C中的整数参数

时间:2016-06-17 17:58:52

标签: c validation limit

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

我正在创建一个List,并为此创建一个接受整数值的节点。我正在检查INT_MININT_MAX的值,但是根据我读到的int值总是在这之间。如果我传递一个long long val,在带有signature node* create(int val)的被调用函数中 - value将被转换为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;
}

2 个答案:

答案 0 :(得分:1)

  

如果传递long的val,是否有办法检测它并且不创建节点?

将功能签名更改为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);
  

对于标准int我还需要执行哪些参数检查来编写健壮的代码?

没有,除非该函数只能使用int的子范围。所有int值都在[INT_MIN ... IN_MAX]范围内。 @Eugene Sh.

答案 1 :(得分:1)

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

node* create(long long val);

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

关于你的第二个任务,我应该说,你不需要检查intINT_MININT_MAX边界的价值,因为它会永远不会超出这些界限。 INT_MAXINT_MINint TYPE自身的实际界限。

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

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