Генерирование и обработка исключений с участием целочисленных типов не является хорошей практикой программирования на языке Си++. Для этих целей следует использовать более информативные типы, например классы, производные от класса std::exception.
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Урок 20. Паттерн 12. Исключения
1. Урок 20. Паттерн 12. Исключения
Генерирование и обработка исключений с участием целочисленных типов не является хорошей
практикой программирования на языке Си++. Для этих целей следует использовать более
информативные типы, например классы, производные от класса std::exception. Но иногда все-таки
приходится работать с менее качественным кодом, таким как показано ниже:
char *ptr1;
char *ptr2;
try {
try {
throw ptr2 - ptr1;
}
catch (int) {
std::cout << "catch 1: on x86" << std::endl;
}
}
catch (ptrdiff_t) {
std::cout << "catch 2: on x64" << std::endl;
}
Следует тщательно избегать генерирования или обработку исключений с использованием
memsize-типов, так как это чревато изменением логики работы программы. Исправление данного
кода может заключаться в замене "catch (int)" на "catch (ptrdiff_t)". А более правильным
решением будет использование специального класса для передачи информации о возникшей
ошибке.
Диагностика
На практике мы пока не встречали данный вид ошибки, хотя инструмент PVS-Studio позволяет их
обнаружить. Диагностическое сообщение V115 будет выдано при попытке генерации исключения
с помощью memsize-типа, а сообщение V116 при использовании memsize-типа в операторе catch.
Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).
Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++"
является ООО "Системы программной верификации". Компания занимается разработкой
программного обеспечения в области анализа исходного кода программ. Сайт компании:
http://www.viva64.com.
Контактная информация: e-mail: support@viva64.com, 300027, г. Тула, а/я 1800.