V121. Implicit conversion of the type of 'new' operator's argument to size_t type.
The analyzer detected a potential error related to calling the operator new. A value of a non-memsize type is passed to the operator "new" as an argument. The operator new takes values of the type size_t, and passing a 32-bit actual argument may signal a potential overflow that may occur when calculating the memory amount being allocated.
Here is an example:
unsigned a = 5; unsigned b = 1024; unsigned c = 1024; unsigned d = 1024; char *ptr = new char[a*b*c*d]; //V121
Here you may see an overflow occurring when calculating the expression "a*b*c*d". As a result, the program allocates less memory than it should. To correct the code, use the type size_t:
size_t a = 5; size_t b = 1024; size_t c = 1024; size_t d = 1024; char *ptr = new char[a*b*c*d]; //Ok
The error will not be diagnosed if the value of the argument is defined as a safe 32-bit constant value. Here is an example of safe code:
char *ptr = new char; const int size = 3*3; char *p2 = new char[size];
This warning message is similar to the warning V106.
Additional materials on this topic:
- 64-bit Lessons. Lesson 17. Pattern 9. Mixed arithmetic.