exponenta event banner

Правила CERT C++

Описание и список стандартных правил CERT C++, поддерживаемых в Polyspace ®

CERT C++ - это набор рекомендаций для разработчиков программного обеспечения. Эти рекомендации используются для безопасного кодирования на языке C++. Они были разработаны по итогам процесса развития на уровне общин. Рекомендации отображаются на вики-сайте сообщества CERT.

Используя эти рекомендации, можно исключить конструкции с неопределенным поведением, которые могут привести к неожиданным результатам во время выполнения и раскрыть слабые места в системе безопасности.

По состоянию на 10 июля 2019 года на сайте CERT C++, находящемся в стадии непрерывной разработки, перечислены 163 правила, включая 80 правил CERT C, которые также применяются в C++.

Polyspace может проверить ваш код по стандарту CERT C++. Используйте Check SEI CERT-C++ (-cert-cpp) для активации подмножеств правил.

Результаты Polyspace

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

CERT C++: DCL30-CОбъявление объектов с соответствующими сроками хранения
CERT C++: DCL39-CПредотвращение утечки информации при заполнении структуры
CERT C++: DCL40-CНе создавать несовместимые объявления одной и той же функции или объекта
CERT C++: DCL50-CPPНе определять переменную функцию в стиле C
CERT C++: DCL51-CPPНе объявляйте и не определяйте зарезервированный идентификатор
CERT C++: DCL52-CPPНикогда не квалифицируйте ссылочный тип с const или volatile
CERT C++: DCL53-CPPНе записывать синтаксически неоднозначные объявления
CERT C++: DCL54-CPPФункции распределения перегрузки и освобождения как пара в одной области
CERT C++: DCL57-CPPНе допускать исключения из деструкторов или функций отмены назначения
CERT C++: DCL58-CPPНе изменять стандартные пространства имен
CERT C++: DCL59-CPPНе определять безымянное пространство имен в файле заголовка
CERT C++: DCL60-CPPПодчиняйтесь правилу одного определения
CERT C++: EXP34-CНе отменять привязку нулевых указателей
CERT C++: EXP35-CНе изменять объекты с временным сроком службы
CERT C++: EXP36-CНе преобразовывать указатели в более строго выровненные типы указателей
CERT C++: EXP37-CФункции вызова с правильным количеством и типом аргументов
CERT C++: EXP39-CНе обращаться к переменной через указатель несовместимого типа
CERT C++: EXP42-CНе сравнивать дополняющие данные
CERT C++: EXP45-CНе выполнять назначения в инструкциях выбора
CERT C++: EXP46-CНе используйте побитовый оператор с логическим операндом
CERT C++: EXP47-CНе вызывать va_arg с аргументом неправильного типа
CERT C++: EXP50-CPPНе зависит от порядка оценки побочных эффектов
CERT C++: EXP52-CPPНе полагайтесь на побочные эффекты в неоцененных операндах
CERT C++: EXP53-CPPНе читать неинициализированную память
CERT C++: EXP54-CPPНе получать доступ к объекту вне срока его службы
CERT C++: EXP55-CPPНе обращаться к объекту cv-qualified через cv-неквалифицированный тип
CERT C++: EXP57-CPPНе приводить и не удалять указатели на неполные классы
CERT C++: EXP58-CPPПередать объект правильного типа в va_start
CERT C++: EXP59-CPPИспользовать offsetof () для допустимых типов и элементов
CERT C++: EXP61-CPPЛямбда-объект не должен переживать ни один из своих ссылочных захваченных объектов
CERT C++: EXP63-CPPНе полагаться на значение объекта, перемещенного из
CERT C++: INT30-CУбедитесь, что неподписанные целочисленные операции не переносятся
CERT C++: INT31-CУбедитесь, что целочисленные преобразования не приводят к потере или неверному толкованию данных
CERT C++: INT32-CУбедитесь, что операции со подписанными целыми числами не приводят к переполнению
CERT C++: INT33-CУбедитесь, что операции разделения и остатка не приводят к ошибкам деления на ноль
CERT C++: INT34-CНе сдвигайте выражение на отрицательное число битов или на большее или равное количеству битов, существующих в операнде
CERT C++: INT35-CИспользовать правильные целочисленные уточнения
CERT C++: INT36-CПреобразование указателя в целое или целое число в указатель
CERT C++: ARR30-CНе формировать и не использовать указатели вне границ или подстрочные индексы массива
CERT C++: ARR37-CНе добавлять и не вычитать целое число в указатель на объект, не являющийся массивом
CERT C++: ARR38-CГарантировать, что библиотечные функции не образуют недопустимые указатели
CERT C++: ARR39-CНе добавлять и не вычитать масштабированное целое число в указатель
CERT C++: CTR50-CPPГарантировать, что индексы контейнеров и итераторы находятся в допустимом диапазоне
CERT C++: STR30-CНе пытайтесь изменить строковые литералы
CERT C++: STR31-CУбедитесь, что в хранилище для строк достаточно места для символьных данных и пустого признака конца
CERT C++: STR32-CНе передавать символьную последовательность, отличную от NULL, библиотечной функции, которая ожидает строку
CERT C++: STR34-CПриведение символов к символу без знака перед преобразованием в более крупные целочисленные размеры
CERT C++: STR37-CАргументы для функций обработки символов должны быть представлены как символ без знака
CERT C++: STR38-CНе путайте узкие и широкие строки символов и функции
CERT C++: STR50-CPPУбедитесь, что в хранилище для строк достаточно места для символьных данных и пустого признака конца
CERT C++: STR53-CPPДоступ к элементу проверки диапазона
CERT C++: MEM30-CНе получать доступ к освобожденной памяти
CERT C++: MEM31-CОсвободить динамически выделяемую память, если она больше не требуется
CERT C++: MEM34-CДинамически выделяется только свободная память
CERT C++: MEM35-CВыделение достаточного объема памяти для объекта
CERT C++: MEM36-CНе изменяйте выравнивание объектов путем вызова realloc ()
CERT C++: MEM50-CPPНе получать доступ к освобожденной памяти
CERT C++: MEM51-CPPПравильно освобождать динамически выделенные ресурсы
CERT C++: MEM52-CPPОбнаружение и обработка ошибок выделения памяти
CERT C++: MEM54-CPPОбеспечить размещение новых с правильно выровненными указателями для достаточной емкости хранения
CERT C++: MEM55-CPPТребования к динамическому управлению хранилищем для замены памяти
CERT C++: MEM56-CPPНе сохранять уже принадлежащее значение указателя в неродственном интеллектуальном указателе
CERT C++: MEM57-CPPИзбегайте использования оператора по умолчанию new для избыточно выровненных типов
CERT C++: FIO30-CИсключить пользовательский ввод из строк формата
CERT C++: FIO32-CНе выполнять операции на устройствах, подходящих только для файлов
CERT C++: FIO34-CРазличают символы, считанные из файла, и EOF или WEOF
CERT C++: FIO37-CНе предполагайте, что fgets () или fgetws () возвращает непустую строку при успешном выполнении
CERT C++: FIO38-CНе копировать объект FILE
CERT C++: FIO39-CНе вводите и не выводите попеременно поток без промежуточного вызова очистки или позиционирования
CERT C++: FIO40-CСброс строк при сбое fgets () или fgetws ()
CERT C++: FIO41-CНе вызывайте getc (), putc (), getwc () или putwc () с аргументом stream, имеющим побочные эффекты
CERT C++: FIO42-CЗакрывать файлы, когда они больше не нужны
CERT C++: FIO44-CИспользовать только значения для fsetpos (), возвращаемые из fgetpos ()
CERT C++: FIO45-CИзбегайте условий гонки TOCTOU при доступе к файлам
CERT C++: FIO46-CНе получать доступ к закрытому файлу
CERT C++: FIO47-CИспользовать допустимые строки формата
CERT C++: FIO50-CPPНе вводите и не выводите попеременно из потока файлов без промежуточного вызова позиционирования
CERT C++: FIO51-CPPЗакрывать файлы, когда они больше не нужны
CERT C++: ERR30-CУстановите значение errno равным нулю перед вызовом библиотечной функции, известной для установки errno, и проверьте значение errno только после того, как функция вернет значение, указывающее на сбой
CERT C++: ERR32-CНе полагайтесь на неопределенные значения errno
CERT C++: ERR33-CОбнаружение и обработка стандартных библиотечных ошибок
CERT C++: ERR34-CОбнаружение ошибок при преобразовании строки в число
CERT C++: ERR50-CPPНе прекращайте программу внезапно
CERT C++: ERR51-CPPОбрабатывать все исключения
CERT C++: ERR52-CPPНе используйте setjmp () или longjmp ()
CERT C++: ERR53-CPPНе ссылайтесь на базовые классы или элементы данных классов в конструкторе или обработчике try-block функции деструктора
CERT C++: ERR54-CPPОбработчики улова должны упорядочивать свои типы параметров от большинства производных до наименьших производных
CERT C++: ERR55-CPPТехнические требования к исключению чести
CERT C++: ERR58-CPPОбрабатывать все исключения, возникающие перед началом выполнения main ()
CERT C++: ERR61-CPPИсключения захвата по ссылке lvalue
CERT C++: OOP50-CPPНе вызывать виртуальные функции из конструкторов или деструкторов
CERT C++: OOP51-CPPНе разделять производные объекты
CERT C++: OOP52-CPPНе удалять полиморфный объект без виртуального деструктора
CERT C++: OOP53-CPPИнициализаторы элементов конструктора записи в каноническом порядке
CERT C++: OOP54-CPPИзящная обработка назначения самокопии
CERT C++: OOP57-CPPПредпочтение специальных функций-членов и перегруженных операторов функциям стандартной библиотеки C
CERT C++: OOP58-CPPОперации копирования не должны изменять исходный объект
CERT C++: CON33-CИзбегайте расовых условий при использовании библиотечных функций
CERT C++: CON37-CНе вызывать сигнал () в многопоточной программе
CERT C++: CON40-CНе ссылайтесь на атомарную переменную дважды в выражении
CERT C++: CON41-CПеренос функций, которые могут ошибочно завершиться сбоем в цикле
CERT C++: CON43-CЗапретить гонки данных в многопоточном коде
CERT C++: CON50-CPPНе уничтожать мьютекс, пока он заблокирован
CERT C++: CON52-CPPПредотвращение скачков данных при доступе к битовым полям из нескольких потоков
CERT C++: CON53-CPPИзбежать взаимоблокировки путем блокировки в заданном порядке
CERT C++: CON54-CPPФункции обтекания, которые могут ложно пробуждаться в цикле
CERT C++: ENV30-CНе изменять объект, на который ссылается возвращаемое значение определенных функций
CERT C++: ENV31-CНе полагаться на указатель среды после операции, которая может сделать его недействительным
CERT C++: ENV32-CВсе обработчики выхода должны возвращаться в нормальном режиме
CERT C++: ENV33-CНе вызывать систему ()
CERT C++: ENV34-CНе сохранять указатели, возвращенные определенными функциями
CERT C++: FLP30-CНе использовать переменные с плавающей запятой в качестве счетчиков циклов
CERT C++: FLP32-CПредотвращение или обнаружение ошибок домена и диапазона в математических функциях
CERT C++: FLP34-CУбедитесь, что преобразования с плавающей запятой находятся в диапазоне нового типа
CERT C++: FLP36-CСохранение точности при преобразовании интегральных значений в тип с плавающей запятой
CERT C++: FLP37-CНе использовать представления объектов для сравнения значений с плавающей запятой
CERT C++: MSC30-CНе используйте функцию rand () для генерации псевдослучайных чисел
CERT C++: MSC32-CПравильно затравить генераторы псевдослучайных чисел
CERT C++: MSC33-CНе передавать недопустимые данные функции asctime ()
CERT C++: MSC37-CУбедитесь, что управление никогда не доходит до конца непустой функции
CERT C++: MSC38-CНе обрабатывайте предопределенный идентификатор как объект, если он может быть реализован только как макрос
CERT C++: MSC39-CНе вызывать va_arg () для va_list с неопределенным значением
CERT C++: MSC40-CНе нарушать ограничения
CERT C++: MSC41-CНикогда не вводите информацию, чувствительную к жесткому коду
CERT C++: MSC50-CPPНе используйте std:: rand () для генерации псевдослучайных чисел
CERT C++: MSC51-CPPУбедитесь, что ваш генератор случайных чисел правильно затравлен
CERT C++: MSC52-CPPФункции возврата значения должны возвращать значение из всех путей выхода
CERT C++: MSC53-CPPНе возвращать из функции, объявленной [[noreturn]]
CERT C++: PRE30-CНе создавать универсальное символьное имя с помощью конкатенации
CERT C++: PRE31-CИзбегать побочных эффектов в аргументах для небезопасных макросов
CERT C++: PRE32-CНе использовать директивы препроцессора при вызове функциональных макросов
CERT C++: SIG31-CНе получать доступ к общим объектам в обработчиках сигналов
CERT C++: SIG34-CНе вызывайте сигнал () из обработчиков прерываемых сигналов
CERT C++: SIG35-CНе возвращать из обработчика сигналов вычислительных исключений