Check for nullptr return from malloc, calloc, and realloc. (#1023)

These are used in ntcore and cscore.  Add inline null-checking versions
to wpi/memory.h and use them throughout.
This commit is contained in:
Peter Johnson
2018-05-04 17:55:46 -07:00
committed by GitHub
parent e8d5759d95
commit 7a34f5d17d
9 changed files with 148 additions and 68 deletions

View File

@@ -0,0 +1,64 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2018 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifndef WPIUTIL_SUPPORT_MEMORY_H_
#define WPIUTIL_SUPPORT_MEMORY_H_
#include <cstdlib>
#include <exception>
#include "wpi/raw_ostream.h"
namespace wpi {
/**
* Wrapper around std::calloc that calls std::terminate on out of memory.
* @param num number of objects to allocate
* @param size number of bytes per object to allocate
* @return Pointer to beginning of newly allocated memory.
*/
inline void* CheckedCalloc(size_t num, size_t size) {
void* p = std::calloc(num, size);
if (!p) {
errs() << "FATAL: failed to allocate " << (num * size) << " bytes\n";
std::terminate();
}
return p;
}
/**
* Wrapper around std::malloc that calls std::terminate on out of memory.
* @param size number of bytes to allocate
* @return Pointer to beginning of newly allocated memory.
*/
inline void* CheckedMalloc(size_t size) {
void* p = std::malloc(size == 0 ? 1 : size);
if (!p) {
errs() << "FATAL: failed to allocate " << size << " bytes\n";
std::terminate();
}
return p;
}
/**
* Wrapper around std::realloc that calls std::terminate on out of memory.
* @param ptr memory previously allocated
* @param size number of bytes to allocate
* @return Pointer to beginning of newly allocated memory.
*/
inline void* CheckedRealloc(void* ptr, size_t size) {
void* p = std::realloc(ptr, size == 0 ? 1 : size);
if (!p) {
errs() << "FATAL: failed to allocate " << size << " bytes\n";
std::terminate();
}
return p;
}
} // namespace wpi
#endif // WPIUTIL_SUPPORT_MEMORY_H_