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 или летучим |
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 | Не возвращайтесь от обработчика сигнала вычислительных исключений |
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.