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 | Убедитесь, что аргументы в size для массивов переменной длины находятся в допустимой области значений |
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 | Гарантируйте, что хранилище для строк имеет достаточное пространство для символьных данных и null terminator |
CERT C: Rule STR32-C | Не передайте последовательность символа без нуля в функцию библиотеки, которая ожидает строку |
CERT C: Rule STR34-C | Приведение символов к беззнаковому char перед преобразованием в большие целочисленные размеры |
CERT C: Rule STR37-C | Аргументы в функции обработки символов должны быть представимы как беззнаковый char |
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 | Не копировать объект ФАЙЛ |
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 | Использовать допустимые строки формата |
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 | Const-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 | Гарантируйте, что взаимно видимые идентификаторы являются уникальными |
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 |
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 | Вычислите целочисленные выражения в большем размере перед сравнением или присвоением этому размеру |
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 | Рассмотрите использование цепи goto при оставлении функции от ошибки при использовании и освобождении ресурсов |
CERT C: Rec. FIO02-C | Каноникализируйте имена путей, происходящих из испорченных источников |
CERT C: Rec. FIO11-C | Будьте осторожны при определении параметра mode 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 | Завершите каждый набор операторов, связанных с меткой обращения, оператором пропуска |
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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.