Правила и рекомендации СЕРТ С

Описание и список стандартных правил и рекомендаций 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Убедитесь, что аргументы в size для массивов переменной длины находятся в допустимой области значений
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Гарантируйте, что хранилище для строк имеет достаточное пространство для символьных данных и null terminator
CERT C: Rule STR32-CНе передайте последовательность символа без нуля в функцию библиотеки, которая ожидает строку
CERT C: Rule STR34-CПриведение символов к беззнаковому char перед преобразованием в большие целочисленные размеры
CERT C: Rule STR37-CАргументы в функции обработки символов должны быть представимы как беззнаковый char
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Не копировать объект ФАЙЛ
CERT C: Rule FIO39-CНе вводите и не выводите поочередно из потока без промежуточного вызова заподлицо или позиционирования
CERT C: Rule FIO40-CСбросьте строки на отказе fgets () или fgetws ()
CERT C: Rule FIO41-CНе вызывайте getc (), putc (), getwc () или putwc () с потоковым аргументом, который имеет побочные эффекты
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-CConst-qualify неизменяемые объекты
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Объявите объекты или функции file-scope, которые не нуждаются во внешнем редактировании, статическими
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Не отбрасывайте const проверки
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Используйте только явно подписанный или беззнаковый тип char для числовых значений
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Рассмотрите использование цепи goto при оставлении функции от ошибки при использовании и освобождении ресурсов

Рек. 09. Входной выход (FIO)

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

Rec. 10. Окружение (ENV)

CERT C: Rec. ENV01-CНе делайте предположений о размере переменного окружения

Rec. 12. Обработка ошибок (ERR)

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

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

CERT C: Rec. API04-CОбеспечьте последовательный и полезный механизм проверки ошибок

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

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

Rec. 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Завершите каждый набор операторов, связанных с меткой обращения, оператором пропуска
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Ограничьте доступ к файлам путем создания тюрьмы

Rec. 51. Microsoft Windows (WIN)

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