Действительность правила довольно сомнительна.В этом примере p1
и p2
имеют абсолютно одинаковый тип: они оба указатели.
Если p2
действительно соответствует правилу, то решение состоит в том, чтобы ввести функцию, чтобы выможет использовать функцию-аргумент-массив-указатель-корректировка.Вот пример с лямбда-выражением, но вы также можете использовать обычную функцию:
char *foo = new foo[array_size];
if (array_size > 42)
[](char foo[]) {
foo[42] = 'X';
}(foo);
C ++ 20 вводит std::span
, что, по-видимому, является решением проблемы:
std::span foo_span{foo, array_size};
if (array_size > 42)
foo_span[42] = 'X';
При этом используется перегрузка класса оператора индекса, а не указатель-индекс, поэтому он соответствует правилу.std::span
, вероятно, не реализуемо без нарушения MISRA, но в стандартной библиотеке есть много других вещей, поэтому я подозреваю, что это не проблема.
В нашем реальном примере мыиспользуя OpenCV uchar *cv::Mat::ptr()
, поэтому мы не можем просто зарезервировать достаточно большой массив.
Возможно, чтобы следовать духу правила, а не буквы, вы должны передать cv::Mat&
в функцию, а не char*
.
PS Я подозреваю, что OpenCV не соответствует MISRA, поэтому, в зависимости от этого, вероятно, это не лучшая вещь, если программа должна соответствовать MISRA.