Метод возвращает указатель или ссылку на внутренний элемент объекта
Этот дефект возникает в следующих случаях:
Метод класса возвращает дескриптор элементу данных. Дескрипторы включают указатели и ссылки.
Метод более доступен, чем элемент данных. Например, метод имеет спецификатор доступа public, но элемент данных private или protected.
Спецификатор доступа определяет доступность элемента класса. Например, член класса, объявленный с помощью private невозможно получить доступ к спецификатору доступа вне класса. Поэтому функции, не относящиеся к члену, не связанные с другом, не могут изменять член.
Когда метод класса возвращает дескриптор менее доступному члену данных, доступность элемента изменяется. Например, если public метод возвращает указатель на private член данных, член данных фактически не private больше. Функция, не являющаяся членом, не являющаяся другом, вызывающая public метод может использовать возвращенный указатель для просмотра и изменения элемента данных.
Кроме того, при назначении указателя элементу данных объекта другому указателю при удалении объекта второй указатель может быть оставлен висящим. Второй указатель указывает на часть объекта, которая больше не существует.
Одно из возможных исправлений состоит в том, чтобы избежать возврата дескриптора элементу данных из метода класса. Возвращает элемент данных по значению, чтобы вернуть копию элемента. Изменение копии не изменяет элемент данных.
Если необходимо вернуть дескриптор, используйте const квалификатор с возвращаемым типом метода, так что дескриптор позволяет просматривать, но не изменять элемент данных.
| Группа: Объектно-ориентированная |
| Язык: C++ |
| По умолчанию: Откл. |
Синтаксис командной строки: BREAKING_DATA_ENCAPSULATION |
| Воздействие: среднее |
| CWE ID: 375, 767 |