C中整数参数的验证
validation of an integer parameter in C
有人告诉我,带参数的函数的最佳实践之一是执行参数验证。
因此,对于字符串检查 null 或空等等。
我正在创建一个列表并为此创建一个接受整数值的节点。我正在检查 INT_MIN
和 INT_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 ?
将函数签名更改为 long
或 long 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_MIN
和 INT_MAX
边界检查你的 int
值,因为 它永远不会超出这些界限。 INT_MAX
和 INT_MIN
是 int
类型本身的实际边界。
根据您的需求(功能需求)检查您的 int
值。
您需要检查 NULL
传递的字符串,因为如果您尝试访问此类字符串,您的程序将会崩溃。但是当你传递一个 int
值时,它 无论如何都会有一个赋值。
有人告诉我,带参数的函数的最佳实践之一是执行参数验证。
因此,对于字符串检查 null 或空等等。
我正在创建一个列表并为此创建一个接受整数值的节点。我正在检查 INT_MIN
和 INT_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 ?
将函数签名更改为 long
或 long 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_MIN
和 INT_MAX
边界检查你的 int
值,因为 它永远不会超出这些界限。 INT_MAX
和 INT_MIN
是 int
类型本身的实际边界。
根据您的需求(功能需求)检查您的 int
值。
您需要检查 NULL
传递的字符串,因为如果您尝试访问此类字符串,您的程序将会崩溃。但是当你传递一个 int
值时,它 无论如何都会有一个赋值。