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

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

CERT C является набором инструкций для разработчиков программного обеспечения и используется для безопасного кодирования на языке C. Это было разработано на сообществе CERT Wiki после основанного на сообществе процесса разработки с первым выпуском, выпущенным в 2 008 и вторым выпуском, выпущенным в 2 014.

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

С 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Не используйте побочные эффекты в операндах к sizeof, _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Не передавайте не пустую отключенную последовательность символов библиотечной функции, которая ожидает строку
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Не изменяйте выравнивание объектов путем вызова перевыделения ()

Правило 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 () с потоковым аргументом, который имеет побочные эффекты
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Правильно парные функции выделения и освобождения

Rec. 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Перенесите составные макросы в цикл с условием продолжения
CERT C: Rec. PRE11-CНе завершайте макроопределения с точкой с запятой

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

CERT C: Rec. DCL00-CConst - квалифицирует неизменяемые объекты
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Обеспечьте контракт между средством записи и вызывающей стороной функций variadic
CERT C: Rec. DCL11-CИзучите проблемы типа, сопоставленные с функциями variadic
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Гарантируйте, что взаимно видимые идентификаторы уникальны

Rec. 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Не помещайте точку с запятой в ту же линию как если, поскольку, или в то время как оператор
CERT C: Rec. EXP19-CИспользуйте фигурные скобки для тела если, поскольку, или в то время как оператор

Rec. 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Не делайте предположения о типе простого международного битового поля, когда используется в выражении
CERT C: Rec. INT13-CИспользуйте побитовые операторы только на операндах без знака
CERT C: Rec. INT14-CПостарайтесь не выполнять битовые и арифметические операции на тех же данных
CERT C: Rec. INT18-CВыполните целые выражения в большем размере прежде, чем сравнить или присвоить тому размеру

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

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

Rec. 06. Массивы (ARR)

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

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

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

Rec. 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 цепи при отъезде функции при ошибке при использовании и высвобождении средств

Rec. 09. Ввод-вывод (FIO)

CERT C: Rec. FIO02-CКанонизируйте пути, происходящие из испорченных источников
CERT C: Rec. FIO11-CЗаботьтесь при определении параметра режима 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Не используйте удержанные от использования или устаревающие функции

Rec. 50. POSIX (POS)

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

Rec. 51. Microsoft Windows (WIN)

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