exponenta event banner

Правила и рекомендации CERT C

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

CERT C представляет собой набор руководящих принципов для разработчиков программного обеспечения и используется для безопасного кодирования на языке C. Он был разработан на вики-сайте сообщества CERT после процесса развития на базе сообщества, первое издание было выпущено в 2008 году, а второе - в 2014 году.

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

На 10 июля 2019 года сайт CERT C, находящийся в стадии непрерывной разработки, перечисляет 121 правило и 187 рекомендаций.

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

Результаты Polyspace

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

Правило 01. Препроцессор (PRE)

CERT C: Rule PRE30-CНе создавать универсальное символьное имя с помощью конкатенации
CERT C: Rule PRE31-CИзбегать побочных эффектов в аргументах для небезопасных макросов
CERT C: Rule PRE32-CНе использовать директивы препроцессора при вызове функциональных макросов

Правило 02. Объявления и инициализация (DCL)

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 перед меткой первого случая

Правило 03. Выражения (EXP)

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 с аргументом неправильного типа

Правило 04. Целые числа (INT)

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Преобразование указателя в целое или целое число в указатель

Правило 05. Плавающая точка (FLP)

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Не использовать представления объектов для сравнения значений с плавающей запятой

Правило 06. Массивы (ARR)

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Не добавлять и не вычитать масштабированное целое число в указатель

Правило 07. Символы и строки (STR)

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Не путайте узкие и широкие строки символов и функции

Правило 08. Управление памятью (MEM)

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 ()

Правило 09. Входной выход (FIO)

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Использовать допустимые строки формата

Правило 10. Окружающая среда (ENV)

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Не сохранять указатели, возвращенные определенными функциями

Правило 11. Сигналы (SIG)

CERT C: Rule SIG30-CВызов только асинхронно-безопасных функций в обработчиках сигналов
CERT C: Rule SIG31-CНе получать доступ к общим объектам в обработчиках сигналов
CERT C: Rule SIG34-CНе вызывайте сигнал () из обработчиков прерываемых сигналов
CERT C: Rule SIG35-CНе возвращать из обработчика сигналов вычислительных исключений

Правило 12. Обработка ошибок (ERR)

CERT C: Rule ERR30-CУстановите значение errno равным нулю перед вызовом библиотечной функции, известной для установки errno, и проверьте значение errno только после того, как функция вернет значение, указывающее на сбой
CERT C: Rule ERR32-CНе полагайтесь на неопределенные значения errno
CERT C: Rule ERR33-CОбнаружение и обработка стандартных библиотечных ошибок
CERT C: Rule ERR34-CОбнаружение ошибок при преобразовании строки в число

Правило 14. Параллелизм (CON)

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Запретить гонки данных в многопоточном коде

Правило 48. Разное (MSC)

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Никогда не используйте информацию, чувствительную к жесткому коду

Правило 50. POSIX (POS)

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

Правило 51. Microsoft Windows (WIN)

CERT C: Rule WIN30-CПравильно парные функции распределения и отмены распределения

Рец. 01. Препроцессор (PRE)

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Не завершайте определения макросов точкой с запятой

Рец. 02. Объявления и инициализация (DCL)

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Гарантия уникальности взаимно видимых идентификаторов

Рец. 03. Выражения (EXP)

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

Рец. 04. Целые числа (INT)

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Вычислять целочисленные выражения большего размера перед сравнением или назначением этого размера

Рец. 05. Плавающая точка (FLP)

CERT C: Rec. FLP00-CПонимание ограничений чисел с плавающей запятой
CERT C: Rec. FLP02-CИзбегайте использования чисел с плавающей запятой при необходимости точного вычисления
CERT C: Rec. FLP03-CОбнаружение и обработка ошибок с плавающей запятой
CERT C: Rec. FLP06-CПреобразование целых чисел в плавающую точку для операций с плавающей запятой

Рец. 06. Массивы (ARR)

CERT C: Rec. ARR01-CНе применять оператор sizeof к указателю при выборе размера массива
CERT C: Rec. ARR02-CЯвно указать границы массива, даже если они неявно определены инициализатором

Рец. 07. Символы и строки (STR)

CERT C: Rec. STR02-CОбеззараживание данных, передаваемых в сложные подсистемы
CERT C: Rec. STR03-CНе следует случайно усекать строку
CERT C: Rec. STR07-CИспользование интерфейсов проверки границ для обработки строк
CERT C: Rec. STR11-CНе указывайте границу символьного массива, инициализированного строковым литералом

Рец. 08. Управление памятью (MEM)

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Рекомендуется использовать цепочку перехода при сохранении функции при ошибке при использовании и освобождении ресурсов

Rec. 09. Входной выход (FIO)

CERT C: Rec. FIO02-CКанонизация имен путей из запятнанных источников
CERT C: Rec. FIO11-CСоблюдайте осторожность при задании параметра режима fopen ()
CERT C: Rec. FIO21-CНе создавать временные файлы в общих каталогах
CERT C: Rec. FIO24-CНе открывать файл, который уже открыт

Рец. 10. Окружающая среда (ENV)

CERT C: Rec. ENV01-CНе делайте предположений о размере переменной среды

Рец. 12. Обработка ошибок (ERR)

CERT C: Rec. ERR00-CПринятие и внедрение последовательной и всеобъемлющей политики обработки ошибок

Рец. 13. Интерфейсы прикладного программирования (API)

CERT C: Rec. API04-CПредоставление согласованного и пригодного для использования механизма проверки ошибок

Рец. 14. Параллелизм (CON)

CERT C: Rec. CON01-CПолучение и освобождение примитивов синхронизации в одном модуле на одном уровне абстракции
CERT C: Rec. CON05-CНе выполнять операции, которые могут блокировать при удержании блокировки

Рец. 48. Разное (MSC)

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Не использовать устаревшие и устаревшие функции

Рец. 50. POSIX (POS)

CERT C: Rec. POS05-CОграничение доступа к файлам путем создания тюрьмы

Рец. 51. Microsoft Windows (WIN)

CERT C: Rec. WIN00-CБыть специфичным при динамической загрузке библиотек