Allocation and deallocation functions can be overloaded at both global and class scopescopes.
If an allocation function is overloaded in a given scope, the corresponding deallocation function should also be overloaded in the same scope.
Failure to overload the corresponding dynamic storage function is likely to violate rules like such as MEM51-CPP. Properly deallocate dynamically allocated resources. For instance, if an overloaded allocation function uses a private heap to perform its allocations, passing a pointer returned by it to the default deallocation function will likely cause undefined behavior. Even in situations where in which the allocation function ultimately calls through to the default allocator to obtain a pointer to memory, failing to overload a corresponding deallocation function may leave the program in an unexpected state by not updating internal allocator state.
...
In this noncompliant code example, an allocation function is overloaded at global scope, however. However, the corresponding deallocation function is not declared. Were an object to be allocated with the overloaded allocation function, any attempt to delete the object would result in undefined behavior in violation of MEM51-CPP. Properly deallocate dynamically allocated resources.
...
In this noncompliant code example, operator new()
is overloaded at class scope, but operator delete()
is not similarly overloaded at class scope. Despite the fact that the overloaded allocation function calls through to the default global allocation function, were an object of type S
to be allocated, any attempt to delete the object would result in leaving the program in an indeterminate state due to failing to update allocation bookkeeping accordingly.
...
DCL35-CPP-EX1: A placement deallocation function may be elided for a corresponding placement allocation function, but only in instances where if the object placement allocation and object construction are guaranteed to be noexcept(true)
. Since Because placement deallocation functions are called only called when some part of the object initialization terminates by throwing an exception, it is safe to elide the placement deallocation function when exceptions cannot be thrown. For instance, some vendors implement compiler flags disabling exception support (such as -fno-cxx-exceptions in Clang or and /EHs-c- in Microsoft Visual Studio), which has implementation-defined behavior when an exception is thrown , but generally results in program termination similar to calling abort()
.
Risk Assessment
Mismatched usage of new
and delete
could lead to a denial-of-service attack.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
DCL54-CPP | Low | Probable | Low | P6 | L2 |
...
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
...