CERT C представляет собой набор руководящих принципов для разработчиков программного обеспечения и используется для безопасного кодирования на языке C. Он был разработан на вики-сайте сообщества CERT после процесса развития на базе сообщества, первое издание было выпущено в 2008 году, а второе - в 2014 году.
Эти рекомендации помогают устранить конструкции с неопределенным поведением, которые могут привести к неожиданным результатам во время выполнения и выявить слабые места в системе безопасности.
На 10 июля 2019 года сайт CERT C, находящийся в стадии непрерывной разработки, перечисляет 121 правило и 187 рекомендаций.
Polyspace может проверить ваш код по стандарту CERT C. Используйте Check SEI CERT-C (-cert-c) для активации подмножеств правил и рекомендаций.
CERT C: Rule PRE30-C | Не создавать универсальное символьное имя с помощью конкатенации |
CERT C: Rule PRE31-C | Избегать побочных эффектов в аргументах для небезопасных макросов |
CERT C: Rule PRE32-C | Не использовать директивы препроцессора при вызове функциональных макросов |
CERT C: Rule DCL30-C | Объявление объектов с соответствующими сроками хранения |
CERT C: Rule DCL31-C | Объявить идентификаторы перед их использованием |
CERT C: Rule DCL36-C | Не объявляйте идентификатор с конфликтующими классификациями связей |
CERT C: Rule DCL37-C | Не объявляйте и не определяйте зарезервированный идентификатор |
CERT C: Rule DCL38-C | Используйте правильный синтаксис при объявлении гибкого элемента массива |
CERT C: Rule DCL39-C | Предотвращение утечки информации при заполнении структуры |
CERT C: Rule DCL40-C | Не создавать несовместимые объявления одной и той же функции или объекта |
CERT C: Rule DCL41-C | Не объявляйте переменные в операторе switch перед меткой первого случая |
CERT C: Rule EXP30-C | Не зависит от порядка оценки побочных эффектов |
CERT C: Rule EXP32-C | Не обращаться к изменчивому объекту через энергонезависимую ссылку |
CERT C: Rule EXP33-C | Не читать неинициализированную память |
CERT C: Rule EXP34-C | Не отменять привязку нулевых указателей |
CERT C: Rule EXP35-C | Не изменять объекты с временным сроком службы |
CERT C: Rule EXP36-C | Не преобразовывать указатели в более строго выровненные типы указателей |
CERT C: Rule EXP37-C | Функции вызова с правильным количеством и типом аргументов |
CERT C: Rule EXP39-C | Не обращаться к переменной через указатель несовместимого типа |
CERT C: Rule EXP40-C | Не изменять постоянные объекты |
CERT C: Rule EXP42-C | Не сравнивать дополняющие данные |
CERT C: Rule EXP43-C | Избегать неопределенного поведения при использовании ограниченных указателей |
CERT C: Rule EXP44-C | Не полагайтесь на побочные эффекты в операндах для размера, _Alignof или _Generic |
CERT C: Rule EXP45-C | Не выполнять назначения в инструкциях выбора |
CERT C: Rule EXP46-C | Не используйте побитовый оператор с логическим операндом |
CERT C: Rule EXP47-C | Не вызывать va_arg с аргументом неправильного типа |
CERT C: Rule INT30-C | Убедитесь, что неподписанные целочисленные операции не переносятся |
CERT C: Rule INT31-C | Убедитесь, что целочисленные преобразования не приводят к потере или неверному толкованию данных |
CERT C: Rule INT32-C | Убедитесь, что операции со подписанными целыми числами не приводят к переполнению |
CERT C: Rule INT33-C | Убедитесь, что операции разделения и остатка не приводят к ошибкам деления на ноль |
CERT C: Rule INT34-C | Не сдвигайте выражение на отрицательное число битов или на большее или равное количеству битов, существующих в операнде |
CERT C: Rule INT35-C | Использовать правильные целочисленные уточнения |
CERT C: Rule INT36-C | Преобразование указателя в целое или целое число в указатель |
CERT C: Rule FLP30-C | Не использовать переменные с плавающей запятой в качестве счетчиков циклов |
CERT C: Rule FLP32-C | Предотвращение или обнаружение ошибок домена и диапазона в математических функциях |
CERT C: Rule FLP34-C | Убедитесь, что преобразования с плавающей запятой находятся в диапазоне нового типа |
CERT C: Rule FLP36-C | Сохранение точности при преобразовании интегральных значений в тип с плавающей запятой |
CERT C: Rule FLP37-C | Не использовать представления объектов для сравнения значений с плавающей запятой |
CERT C: Rule ARR30-C | Не формировать и не использовать указатели вне границ или подстрочные индексы массива |
CERT C: Rule ARR32-C | Убедитесь, что аргументы размера для массивов переменной длины находятся в допустимом диапазоне |
CERT C: Rule ARR36-C | Не вычитайте и не сравнивайте два указателя, которые не ссылаются на один и тот же массив |
CERT C: Rule ARR37-C | Не добавлять и не вычитать целое число в указатель на объект, не являющийся массивом |
CERT C: Rule ARR38-C | Гарантировать, что библиотечные функции не образуют недопустимые указатели |
CERT C: Rule ARR39-C | Не добавлять и не вычитать масштабированное целое число в указатель |
CERT C: Rule STR30-C | Не пытайтесь изменить строковые литералы |
CERT C: Rule STR31-C | Убедитесь, что в хранилище для строк достаточно места для символьных данных и пустого признака конца |
CERT C: Rule STR32-C | Не передавать символьную последовательность, отличную от NULL, библиотечной функции, которая ожидает строку |
CERT C: Rule STR34-C | Приведение символов к символу без знака перед преобразованием в более крупные целочисленные размеры |
CERT C: Rule STR37-C | Аргументы для функций обработки символов должны быть представлены как символ без знака |
CERT C: Rule STR38-C | Не путайте узкие и широкие строки символов и функции |
CERT C: Rule MEM30-C | Не получать доступ к освобожденной памяти |
CERT C: Rule MEM31-C | Освободить динамически выделяемую память, если она больше не требуется |
CERT C: Rule MEM33-C | Динамическое выделение и копирование структур, содержащих гибкий элемент массива |
CERT C: Rule MEM34-C | Динамически выделяется только свободная память |
CERT C: Rule MEM35-C | Выделение достаточного объема памяти для объекта |
CERT C: Rule MEM36-C | Не изменяйте выравнивание объектов путем вызова realloc () |
CERT C: Rule FIO30-C | Исключить пользовательский ввод из строк формата |
CERT C: Rule FIO32-C | Не выполнять операции на устройствах, подходящих только для файлов |
CERT C: Rule FIO34-C | Различают символы, считанные из файла, и EOF или WEOF |
CERT C: Rule FIO37-C | Не предполагайте, что fgets () или fgetws () возвращает непустую строку при успешном выполнении |
CERT C: Rule FIO38-C | Не копировать объект FILE |
CERT C: Rule FIO39-C | Не вводите и не выводите попеременно поток без промежуточного вызова очистки или позиционирования |
CERT C: Rule FIO40-C | Сброс строк при сбое fgets () или fgetws () |
CERT C: Rule FIO41-C | Не вызывайте getc (), putc (), getwc () или putwc () с аргументом stream, имеющим побочные эффекты |
CERT C: Rule FIO42-C | Закрывать файлы, когда они больше не нужны |
CERT C: Rule FIO44-C | Использовать только значения для fsetpos (), возвращаемые из fgetpos () |
CERT C: Rule FIO45-C | Избегайте условий гонки TOCTOU при доступе к файлам |
CERT C: Rule FIO46-C | Не получать доступ к закрытому файлу |
CERT C: Rule FIO47-C | Использовать допустимые строки формата |
CERT C: Rule ENV30-C | Не изменять объект, на который ссылается возвращаемое значение определенных функций |
CERT C: Rule ENV31-C | Не полагаться на указатель среды после операции, которая может сделать его недействительным |
CERT C: Rule ENV32-C | Все обработчики выхода должны возвращаться в нормальном режиме |
CERT C: Rule ENV33-C | Не вызывать систему () |
CERT C: Rule ENV34-C | Не сохранять указатели, возвращенные определенными функциями |
CERT C: Rule SIG30-C | Вызов только асинхронно-безопасных функций в обработчиках сигналов |
CERT C: Rule SIG31-C | Не получать доступ к общим объектам в обработчиках сигналов |
CERT C: Rule SIG34-C | Не вызывайте сигнал () из обработчиков прерываемых сигналов |
CERT C: Rule SIG35-C | Не возвращать из обработчика сигналов вычислительных исключений |
CERT C: Rule ERR30-C | Установите значение errno равным нулю перед вызовом библиотечной функции, известной для установки errno, и проверьте значение errno только после того, как функция вернет значение, указывающее на сбой |
CERT C: Rule ERR32-C | Не полагайтесь на неопределенные значения errno |
CERT C: Rule ERR33-C | Обнаружение и обработка стандартных библиотечных ошибок |
CERT C: Rule ERR34-C | Обнаружение ошибок при преобразовании строки в число |
CERT C: Rule CON30-C | Очистка хранилища для конкретных потоков |
CERT C: Rule CON31-C | Не уничтожать мьютекс, пока он заблокирован |
CERT C: Rule CON32-C | Предотвращение скачков данных при доступе к битовым полям из нескольких потоков |
CERT C: Rule CON33-C | Избегайте расовых условий при использовании библиотечных функций |
CERT C: Rule CON34-C | Объявление объектов, совместно используемых потоками, с соответствующими сроками хранения |
CERT C: Rule CON35-C | Избежать взаимоблокировки путем блокировки в заданном порядке |
CERT C: Rule CON36-C | Функции обтекания, которые могут ложно пробуждаться в цикле |
CERT C: Rule CON37-C | Не вызывать сигнал () в многопоточной программе |
CERT C: Rule CON38-C | Сохранение безопасности и живости резьбы при использовании переменных условий |
CERT C: Rule CON39-C | Не присоединяйте и не отсоединяйте поток, который был ранее присоединен или отсоединен |
CERT C: Rule CON40-C | Не ссылайтесь на атомарную переменную дважды в выражении |
CERT C: Rule CON41-C | Перенос функций, которые могут ошибочно завершиться сбоем в цикле |
CERT C: Rule CON43-C | Запретить гонки данных в многопоточном коде |
CERT C: Rule MSC30-C | Не используйте функцию rand () для генерации псевдослучайных чисел |
CERT C: Rule MSC32-C | Правильно затравить генераторы псевдослучайных чисел |
CERT C: Rule MSC33-C | Не передавать недопустимые данные функции asctime () |
CERT C: Rule MSC37-C | Убедитесь, что управление никогда не доходит до конца непустой функции |
CERT C: Rule MSC38-C | Не обрабатывайте предопределенный идентификатор как объект, если он может быть реализован только как макрос |
CERT C: Rule MSC39-C | Не вызывать va_arg () для va_list с неопределенным значением |
CERT C: Rule MSC40-C | Не нарушать ограничения |
CERT C: Rule MSC41-C | Никогда не используйте информацию, чувствительную к жесткому коду |
CERT C: Rule POS30-C | Правильно использовать функцию readlink () |
CERT C: Rule POS33-C | Не использовать vfork () |
CERT C: Rule POS34-C | Не вызывать putenv () с указателем на автоматическую переменную в качестве аргумента |
CERT C: Rule POS35-C | Избегайте расовых условий при проверке наличия символической ссылки |
CERT C: Rule POS36-C | Соблюдать правильный порядок отзыва при отказе от привилегий |
CERT C: Rule POS37-C | Убедитесь, что отказ от привилегий успешен |
CERT C: Rule POS38-C | Остерегайтесь расовых условий при использовании дескрипторов вилки и файлов |
CERT C: Rule POS39-C | Используйте правильный порядок байтов при передаче данных между системами |
CERT C: Rule POS44-C | Не использовать сигналы для завершения потоков |
CERT C: Rule POS47-C | Не использовать потоки, которые можно отменить асинхронно |
CERT C: Rule POS48-C | Не разблокируйте и не уничтожайте мьютекс другого потока POSIX |
CERT C: Rule POS49-C | Если доступ к данным должен осуществляться несколькими потоками, укажите мьютекс и убедитесь, что доступ к смежным данным также не осуществляется |
CERT C: Rule POS50-C | Объявление объектов, совместно используемых потоками POSIX, с соответствующей длительностью хранения |
CERT C: Rule POS51-C | Избегайте взаимоблокировки с потоками POSIX путем блокировки в заданном порядке |
CERT C: Rule POS52-C | Не выполняйте операции, которые могут блокировать при удержании блокировки POSIX |
CERT C: Rule POS53-C | Не использовать более одного мьютекса для одновременных операций ожидания для переменной условия |
CERT C: Rule POS54-C | Обнаружение и обработка ошибок библиотеки POSIX |
CERT C: Rule WIN30-C | Правильно парные функции распределения и отмены распределения |
CERT C: Rec. PRE00-C | Предпочтение встроенных или статических функций функциональным макросам |
CERT C: Rec. PRE01-C | Использовать круглые скобки в макросах вокруг имен параметров |
CERT C: Rec. PRE06-C | Включить файлы заголовков в защиту от включения |
CERT C: Rec. PRE07-C | Избегать использования повторяющихся вопросительных знаков |
CERT C: Rec. PRE09-C | Не заменять безопасные функции устаревшими или устаревшими |
CERT C: Rec. PRE10-C | Перенос многостадийных макросов в цикл do-while |
CERT C: Rec. PRE11-C | Не завершайте определения макросов точкой с запятой |
CERT C: Rec. DCL00-C | Конст-квалифицировать неизменяемые объекты |
CERT C: Rec. DCL01-C | Не использовать имена переменных в подскопах повторно |
CERT C: Rec. DCL02-C | Использование визуально отличных идентификаторов |
CERT C: Rec. DCL06-C | Использовать значимые символьные константы для представления буквенных значений |
CERT C: Rec. DCL07-C | Включить соответствующую информацию о типе в описатели функций |
CERT C: Rec. DCL10-C | Ведение договора между устройством записи и вызывающим абонентом различных функций |
CERT C: Rec. DCL11-C | описывать проблемы типа, связанные с различными функциями; |
CERT C: Rec. DCL12-C | Реализация абстрактных типов данных с использованием непрозрачных типов |
CERT C: Rec. DCL13-C | Объявить параметры функции, которые являются указателями на значения, не измененные функцией, как const |
CERT C: Rec. DCL15-C | Объявить объекты или функции файловой области, которые не нуждаются во внешней связи, как статические |
CERT C: Rec. DCL16-C | Используйте «» L «», а не «» l «», чтобы указать длинное значение |
CERT C: Rec. DCL18-C | Не начинайте целочисленные константы с 0 при указании десятичного значения |
CERT C: Rec. DCL19-C | Минимизация объема переменных и функций |
CERT C: Rec. DCL22-C | Использовать изменчивость для данных, которые невозможно кэшировать |
CERT C: Rec. DCL23-C | Гарантия уникальности взаимно видимых идентификаторов |
CERT C: Rec. EXP00-C | Использовать скобки для приоритета операции |
CERT C: Rec. EXP05-C | Не отбрасывать квалификацию конста |
CERT C: Rec. EXP08-C | Убедитесь, что арифметика указателя используется правильно |
CERT C: Rec. EXP09-C | Используйте sizeof для определения размера типа или переменной |
CERT C: Rec. EXP10-C | Не зависит от порядка оценки субэкспрессий или порядка, в котором происходят побочные эффекты |
CERT C: Rec. EXP12-C | Не игнорировать значения, возвращаемые функциями |
CERT C: Rec. EXP13-C | Относиться к операторам отношения и равенства так, как если бы они были неассоциативными |
CERT C: Rec. EXP15-C | Не помещайте точку с запятой в ту же строку, что и оператор if, for или while |
CERT C: Rec. EXP19-C | Используйте скобки для тела оператора if, for или while |
CERT C: Rec. INT00-C | Понимание модели данных, используемой при внедрении |
CERT C: Rec. INT02-C | Понимание правил целочисленного преобразования |
CERT C: Rec. INT04-C | Ограничение целочисленных значений, полученных из запятнанных источников |
CERT C: Rec. INT07-C | Использовать только явно подписанный или неподписанный тип символа для числовых значений |
CERT C: Rec. INT08-C | Убедитесь, что все целочисленные значения находятся в диапазоне |
CERT C: Rec. INT09-C | Убедитесь, что константы перечисления соответствуют уникальным значениям |
CERT C: Rec. INT10-C | Не предполагайте положительного остатка при использовании оператора% |
CERT C: Rec. INT12-C | Не делайте предположений о типе обычного битового поля int при использовании в выражении |
CERT C: Rec. INT13-C | Использовать побитовые операторы только для неподписанных операндов |
CERT C: Rec. INT14-C | Избегайте выполнения побитовых и арифметических операций с одними и теми же данными |
CERT C: Rec. INT18-C | Вычислять целочисленные выражения большего размера перед сравнением или назначением этого размера |
CERT C: Rec. FLP00-C | Понимание ограничений чисел с плавающей запятой |
CERT C: Rec. FLP02-C | Избегайте использования чисел с плавающей запятой при необходимости точного вычисления |
CERT C: Rec. FLP03-C | Обнаружение и обработка ошибок с плавающей запятой |
CERT C: Rec. FLP06-C | Преобразование целых чисел в плавающую точку для операций с плавающей запятой |
CERT C: Rec. ARR01-C | Не применять оператор sizeof к указателю при выборе размера массива |
CERT C: Rec. ARR02-C | Явно указать границы массива, даже если они неявно определены инициализатором |
CERT C: Rec. STR02-C | Обеззараживание данных, передаваемых в сложные подсистемы |
CERT C: Rec. STR03-C | Не следует случайно усекать строку |
CERT C: Rec. STR07-C | Использование интерфейсов проверки границ для обработки строк |
CERT C: Rec. STR11-C | Не указывайте границу символьного массива, инициализированного строковым литералом |
CERT C: Rec. MEM00-C | Выделение и освобождение памяти в одном модуле, на одном уровне абстракции |
CERT C: Rec. MEM01-C | Хранить новое значение в указателях сразу после освобождения () |
CERT C: Rec. MEM02-C | Немедленное приведение результата вызова функции выделения памяти в указатель на назначенный тип |
CERT C: Rec. MEM03-C | Очистить конфиденциальную информацию, хранящуюся в повторно используемых ресурсах |
CERT C: Rec. MEM04-C | Остерегайтесь нулевых назначений |
CERT C: Rec. MEM05-C | Избегайте выделения больших стеков |
CERT C: Rec. MEM06-C | Убедитесь, что конфиденциальные данные не записаны на диск |
CERT C: Rec. MEM11-C | Не допускайте бесконечное кучное пространство |
CERT C: Rec. MEM12-C | Рекомендуется использовать цепочку перехода при сохранении функции при ошибке при использовании и освобождении ресурсов |
CERT C: Rec. FIO02-C | Канонизация имен путей из запятнанных источников |
CERT C: Rec. FIO11-C | Соблюдайте осторожность при задании параметра режима fopen () |
CERT C: Rec. FIO21-C | Не создавать временные файлы в общих каталогах |
CERT C: Rec. FIO24-C | Не открывать файл, который уже открыт |
CERT C: Rec. ENV01-C | Не делайте предположений о размере переменной среды |
CERT C: Rec. ERR00-C | Принятие и внедрение последовательной и всеобъемлющей политики обработки ошибок |
CERT C: Rec. API04-C | Предоставление согласованного и пригодного для использования механизма проверки ошибок |
CERT C: Rec. CON01-C | Получение и освобождение примитивов синхронизации в одном модуле на одном уровне абстракции |
CERT C: Rec. CON05-C | Не выполнять операции, которые могут блокировать при удержании блокировки |
CERT C: Rec. MSC01-C | Стремиться к логической полноте |
CERT C: Rec. MSC04-C | Последовательное и удобочитаемое использование комментариев |
CERT C: Rec. MSC12-C | Обнаружение и удаление кода, который не действует или никогда не выполняется |
CERT C: Rec. MSC13-C | Обнаружение и удаление неиспользуемых значений |
CERT C: Rec. MSC15-C | Не зависит от неопределенного поведения |
CERT C: Rec. MSC17-C | Завершение каждого набора инструкций, связанных с меткой обращения, с помощью инструкции break |
CERT C: Rec. MSC18-C | Будьте осторожны при обработке конфиденциальных данных, таких как пароли, в программном коде |
CERT C: Rec. MSC20-C | Не использовать оператор switch для передачи управления в сложный блок |
CERT C: Rec. MSC21-C | Использовать надежные условия окончания шлейфа |
CERT C: Rec. MSC22-C | Безопасное использование средства setjmp (), longjmp () |
CERT C: Rec. MSC24-C | Не использовать устаревшие и устаревшие функции |
CERT C: Rec. POS05-C | Ограничение доступа к файлам путем создания тюрьмы |
CERT C: Rec. WIN00-C | Быть специфичным при динамической загрузке библиотек |
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.