MISRA C++:2008 Rule 15-1-2

NULL не должен быть выдан явным образом

Описание

Управляйте определением

NULL не должен быть выдан явным образом.

Объяснение

Макро-NULL обычно используется, чтобы относиться к нулевым указателям. Compliers интерпретируют NULL как целое число с нулем значения, вместо указателя. Когда вы используете NULL явным образом в throw оператор, вы можете ожидать, что оператор повысит исключение типа указателя. throw(NULL) эквивалентно throw(0) и повышает целочисленное исключение. Это поведение может противоречить ожиданию разработчика и может привести к ошибкам, которые затрудняют, чтобы найти. Избегайте использования NULL явным образом в throw оператор.

Реализация Polyspace

Polyspace® отмечает throw оператор, который повышает NULL явным образом. Polyspace не отмечает оператор когда NULL повышен после броска до определенного типа или присвоения его к типу указателя.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

развернуть все

typedef          char         char_t;
typedef signed   int          int32_t;

#include <cstddef>

void foo()
{
	try {
		char_t * p1 = NULL;		
		throw ( NULL );            // Noncompliant
		throw(p1); //Compliant
		throw ( static_cast < const char_t * > ( NULL ) ); // Compliant
	} catch ( int32_t i ) {        // NULL exception handled here
		// /*...*/
	} catch ( const char_t * ) { // Other two exceptions are handled here
		// /*...*/
	}
}

В этом примере три исключения повышены непосредственно при помощи throw операторы.

  • Polyspace отмечает оператор throw(NULL) потому что это явным образом повышает NULL как исключение. Вы можете ожидать, что этот оператор повышает исключение типа указателя, которое обработано во втором catch блок. Этот оператор на самом деле повышает int исключение, которое обработано в первом catch блок.

  • Другой throw операторы показывают совместимый метод использования NULL в throw оператор. Например, второй throw оператор повышает char* это присвоено значение NULL. Третий throw оператор повышает char* путем кастинга NULL к char*. Поскольку эти операторы не повышают NULL явным образом Polyspace не отмечает их.

Проверяйте информацию

Группа: Обработка исключений
Категория: необходимый
Введенный в R2013b