欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > C语言strtol函数使用的坑

C语言strtol函数使用的坑

2025/2/8 21:40:23 来源:https://blog.csdn.net/fantasyYXQ/article/details/143447390  浏览:    关键词:C语言strtol函数使用的坑

项目中有个需求要操作文件,有个文件操作函数代码中调用了strtol函数,且该处代码是前人写的

代码工具检查出这个文件操作函数溢出值或截断值的风险,不明觉厉

闹了半天,man查看strtol函数的使用方法,该函数的返回值是long int类型,而我们的程序中使用的是int类型接收。由于检查工具未明确指出是接收返回值类型的原因,而是一直提醒可能有溢出,所以弄了半天,也是怪自己经验不足

STRTOL(3)                                                                                 Linux Programmer's Manual                                                                                 STRTOL(3)NAMEstrtol, strtoll, strtoq - convert a string to a long integerSYNOPSIS#include <stdlib.h>long int strtol(const char *nptr, char **endptr, int base);long long int strtoll(const char *nptr, char **endptr, int base);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):strtoll():_ISOC99_SOURCE|| /* Glibc versions <= 2.19: */ _SVID_SOURCE || _BSD_SOURCEDESCRIPTIONThe strtol() function converts the initial part of the string in nptr to a long integer value according to the given base, which must be between 2 and 36 inclusive, or be the special value 0.The  string  may begin with an arbitrary amount of white space (as determined by isspace(3)) followed by a single optional '+' or '-' sign.  If base is zero or 16, the string may then include a "0x"or "0X" prefix, and the number will be read in base 16; otherwise, a zero base is taken as 10 (decimal) unless the next character is '0', in which case it is taken as 8 (octal).The remainder of the string is converted to a long int value in the obvious manner, stopping at the first character which is not a valid digit in the given base.  (In bases above 10, the letter  'A'in either uppercase or lowercase represents 10, 'B' represents 11, and so forth, with 'Z' representing 35.)If  endptr is not NULL, strtol() stores the address of the first invalid character in *endptr.  If there were no digits at all, strtol() stores the original value of nptr in *endptr (and returns 0).In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid.The strtoll() function works just like the strtol() function but returns a long long integer value.RETURN VALUEThe strtol() function returns the result of the conversion, unless the value would underflow or overflow.  If an underflow occurs, strtol() returns LONG_MIN.  If an overflow occurs, strtol() returnsLONG_MAX.  In both cases, errno is set to ERANGE.  Precisely the same holds for strtoll() (with LLONG_MIN and LLONG_MAX instead of LONG_MIN and LONG_MAX).ERRORSEINVAL (not in C99) The given base contains an unsupported value.ERANGE The resulting value was out of range.The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned).ATTRIBUTESFor an explanation of the terms used in this section, see attributes(7).┌──────────────────────────────┬───────────────┬────────────────┐│Interface                     │ Attribute     │ Value          │├──────────────────────────────┼───────────────┼────────────────┤│strtol(), strtoll(), strtoq() │ Thread safety │ MT-Safe locale │└──────────────────────────────┴───────────────┴────────────────┘
CONFORMING TO

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com