#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int demo_check_string_not_empty(char *s)
{
if (s != NULL)
return strlen(s) > 0; /* check string null-terminated and not empty */
else
return 0;
}
int unsafestrtonumeric(char* argv1)
{
int s = 0;
if (demo_check_string_not_empty(argv1))
{
s = atoi(argv1);
}
return s;
}
В этом примере argv1
преобразуется в целое число с atoi
. atoi
не содержит ошибок для недопустимой целочисленной строки. Преобразование может неожиданно завершиться неуспешно.
Коррекция - Использование strtol
вместо этогоОдной из возможных коррекций является использование strtol
для проверки строки входа и преобразованного целого числа.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
static int demo_check_string_not_empty(char *s)
{
if (s != NULL)
return strlen(s) > 0; /* check string null-terminated and not empty */
else
return 0;
}
int unsafestrtonumeric(char *argv1)
{
char *c_str = argv1;
char *end;
long sl;
if (demo_check_string_not_empty(c_str))
{
errno = 0; /* set errno for error check */
sl = strtol(c_str, &end, 10);
if (end == c_str)
{
(void)fprintf(stderr, "%s: not a decimal number\n", c_str);
}
else if ('\0' != *end)
{
(void)fprintf(stderr, "%s: extra characters: %s\n", c_str, end);
}
else if ((LONG_MIN == sl || LONG_MAX == sl) && ERANGE == errno)
{
(void)fprintf(stderr, "%s out of range of type long\n", c_str);
}
else if (sl > INT_MAX)
{
(void)fprintf(stderr, "%ld greater than INT_MAX\n", sl);
}
else if (sl < INT_MIN)
{
(void)fprintf(stderr, "%ld less than INT_MIN\n", sl);
}
else
{
return (int)sl;
}
}
return 0;
}