CERT C++ - это набор рекомендаций для разработчиков программного обеспечения. Эти рекомендации используются для безопасного кодирования на языке C++. Они были разработаны по итогам процесса развития на уровне общин. Рекомендации отображаются на вики-сайте сообщества CERT.
Используя эти рекомендации, можно исключить конструкции с неопределенным поведением, которые могут привести к неожиданным результатам во время выполнения и раскрыть слабые места в системе безопасности.
По состоянию на 10 июля 2019 года на сайте CERT C++, находящемся в стадии непрерывной разработки, перечислены 163 правила, включая 80 правил CERT C, которые также применяются в C++.
Polyspace может проверить ваш код по стандарту CERT C++. Используйте Check SEI CERT-C++ (-cert-cpp) для активации подмножеств правил.
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 | Не возвращать из обработчика сигналов вычислительных исключений |
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.