Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Why is atoi dangerous and what should be used instead?
According to Which functions in the C standard library must always be avoided?, the atoi
family of functions is dangerous and should never be used for any purpose. The rationale given in the answer is this:
These have no error handling but invoke undefined behavior whenever errors occur. Completely superfluous functions that can be replaced with the
strtol()
family of functions.strtol(src, NULL, 10)
is per definition 100% equivalent to atoi except with well-defined error handling. References: ISO 9899:2018 7.22.1.2, MISRA-C:2012 rule 21.7.
Where exactly is it said that the functions could invoke undefined behavior and how is the strtol
(family) guaranteed to be equivalent?
1 answer
The atoi
family of functions should never be used for any purpose - they are broken by design.
The reason why can be found in the C standard C23 7.24.1:
The functions
atof
,atoi
,atol
, andatoll
are not required to affect the value of the integer expressionerrno
on an error. If the value of the result cannot be represented, the behavior is undefined.
Meaning that the functions do not necessary have any error handling at all - if you pass a string which consists of other things than digit characters, anything can happen.
Furthermore, the same chapter makes this guarantee (C23 7.24.2):
Except for the behavior on error, they are equivalent to
atoi: (int)strtol(nptr, nullptr, 10) atol: strtol(nptr, nullptr, 10) atoll: strtoll(nptr, nullptr, 10)
So the solution is to always use the strtol
family of functions instead. They have error handling but are otherwise 100% equivalent to the atoi
family, when passing base 10 = decimal as parameter.
(In fact some of the better standard libraries implements atoi
as a mere wrapper macro around strtol
.)
0 comment threads