V772. Calling the 'delete' operator for a void pointer will cause undefined behavior.


The analyzer detected a possible error that has to do with using the 'delete' or 'delete []' operator together with a non-typed pointer (void*). As specified by the C++ standard (section $5.3.5/3), such use of 'delete' results in undefined behavior.

Consider the following example:

class Example
{
  int *buf;

public:
  Example(size_t n = 1024) { buf = new int[n]; }
  ~Example() { delete[] buf; }
};

....
void *ptr = new Example();
....
delete ptr;
....

What is dangerous about this code is that the compiler does not actually know the type of the 'ptr' pointer. Therefore, deleting a non-typed pointer may cause various defects, for example, a memory leak, as the 'delete' operator will not call the destructor for the object of type 'Example' pointed to by 'ptr'.

If you really mean to use a non-typed pointer, then you need to cast it to the original type before using 'delete' ('delete[]'), for example:

....
void *ptr = new Example();
....
delete (Example*)ptr;
....

Otherwise, it is recommended that you use only typed pointers with 'delete' ('delete[]') to avoid errors:

....
Example *ptr = new Example();
....
delete ptr;
....

According to Common Weakness Enumeration, potential errors found by using this diagnostic are classified as CWE-758.


Bugs Found

Checked Projects
334
Collected Errors
12 668