Надо не "границы массивов" проверять, а сразу писать код так, чтоб
минимизировать вероятность ошибки. В частности, отказаться по
возможности от сырых указателей, и указателей вообще. Например,
позаимствовать span из C++20. Для строк -- string_view из C++17. Во
всех случаях подразумевается некий класс, который оперирует
последовательностью доступной через пару итераторов, но не владеет
им. Владеет им кто-то другой. Кстати всегда следует задумываться владеющий указатель или нет, что-то вроде experimental::observer_ptr (заабандонили, по-моему зря).