##Issues Concerning Allocation##
Issues Concerning Allocation
##Integer Overflow##
Integer Overflow
##Issues Concerning Allocation##
##Integer Overflow##
Issues Concerning Allocation
Integer Overflow
Note that it is possible that myNumber
is equal to INT_MIN
, and then the line myNumber *= -1;
would lead to integer overflow (invoking undefined behavior for signed
integer types). Consider using a fixed-width type, such as int32_t
, that is passed into the function, and copy this to a larger fixed-width type (int64_t
) type for a working copy within the function. The reasoning here is that the widths of the integer types are implementation-dependent, and even long int
is only guaranteed to be at least as wide as int
. By choosing specific widths for your integer types, you can protect against integer overflow in your calculations. The int64_t
type is larger than int32_t
, so the smallest value which can be held by an int32_t
, when stored in an int64_t
, can safely be multiplied by -1
.
Note that it is possible that myNumber
is equal to INT_MIN
, and then the line myNumber *= -1;
would lead to integer overflow (invoking undefined behavior for signed
integer types). Consider using a fixed-width type, such as int32_t
, that is passed into the function, and copy this to a larger fixed-width type (int64_t
) type for a working copy within the function. The reasoning here is that the widths of the integer types are implementation-dependent, and even long int
is only guaranteed to be at least as wide as int
. By choosing specific widths for your integer types, you can protect against integer overflow in your calculations. The int64_t
type is larger than int32_t
, so the smallest value which can be held by an int32_t
, when stored in an int64_t
, can safely be multiplied by -1
.
Note that it is possible that myNumber
is equal to INT_MIN
, and then the line myNumber *= -1;
would lead to integer overflow (invoking undefined behavior for signed
integer types). Consider using a fixed-width type, such as int32_t
, that is passed into the function, and copy this to a larger fixed-width type (int64_t
) for a working copy within the function. The reasoning here is that the widths of the integer types are implementation-dependent, and even long int
is only guaranteed to be at least as wide as int
. By choosing specific widths for your integer types, you can protect against integer overflow in your calculations. The int64_t
type is larger than int32_t
, so the smallest value which can be held by an int32_t
, when stored in an int64_t
, can safely be multiplied by -1
.
I would also suggest moving the allocation from main()
into the intToStr()
function (which is already reallocating the memory), and returning a pointer to the allocated memory fromto the calling function. This would necessitate changing the function signature of intToStr()
to:
I would also suggest moving the allocation from main()
into the intToStr()
function (which is already reallocating the memory), and returning a pointer to the allocated memory from the calling function. This would necessitate changing the function signature of intToStr()
to:
I would also suggest moving the allocation from main()
into the intToStr()
function (which is already reallocating the memory), and returning a pointer to the allocated memory to the calling function. This would necessitate changing the function signature of intToStr()
to: