Правила 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 или летучим
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-квалифицированному объекту через 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Гарантируйте, что хранилище для строк имеет достаточное пространство для символьных данных и null terminator
CERT C++: STR32-CНе передайте последовательность символа без нуля в функцию библиотеки, которая ожидает строку
CERT C++: STR34-CПриведение символов к беззнаковому char перед преобразованием в большие целочисленные размеры
CERT C++: STR37-CАргументы в функции обработки символов должны быть представимы как беззнаковый char
CERT C++: STR38-CНе путайте узкие и широкие символьные строки и функции
CERT C++: STR50-CPPГарантируйте, что хранилище для строк имеет достаточное пространство для символьных данных и null terminator
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Не копировать объект ФАЙЛ
CERT C++: FIO39-CНе вводите и не выводите поочередно из потока без промежуточного вызова заподлицо или позиционирования
CERT C++: FIO40-CСбросьте строки на отказе fgets () или fgetws ()
CERT C++: FIO41-CНе вызывайте getc (), putc (), getwc () или putwc () с потоковым аргументом, который имеет побочные эффекты
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Не ссылайтесь на базовые классы или представители данных классов в конструкторе или обработчике деструктора function-try-block
CERT C++: ERR54-CPPОбработчики catch должны заказывать свои типы параметров от наиболее производных до наименее производных
CERT C++: ERR55-CPPСпецификации исключений Honor
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 Standard Library
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Не возвращайтесь от обработчика сигнала вычислительных исключений