The program contains code like follows:
int size;
...
int *pi = (int*)calloc(size, sizeof(int));
...
Here is the error message when compiled with gcc7.2:
error: argument 1 range [18446744071562067968, 18446744073709551615] exceeds maximum object size 9223372036854775807 [-Werror=alloc-size-larger-than=]
When I change
int *pi = (int*)calloc(size, sizeof(int));
to
int *pi = (int*)calloc((unsigned int)size, sizeof(int));
The error disappeared.
However, in the program, there are many malloc
and calloc
used like my original version.
Why there is only one error detected by gcc?
I recently had the same problem on my GCC 9.1 build, and I found this discussion on the GCC Bugzilla:
https://gcc.gnu.org/bugzilla//show_bug.cgi?id=85783
As mentioned in the link discussion, I was able to suppress the warning by checking the size parameter against PTRDIFF_MAX.
The warning depends on the range that GCC thinks size
has. At that particular point in the program it is deemed to be in that (exceedingly large) range. At the other malloc/calloc callsites perhaps it wasn't so large.
It would largely depend on how size
is calculated at different points in the program. Of course, making sure that it is actually initialised before any use is the first step.