← На главную

Стив Клайн предупреждает: в 2026 году писать безопасный C и C++ без контроля ИИ почти невозможно

20.05.2026 06:07 · hackernews

Кардинал Рихелио мог бы сказать, что всего шести строк кода эксперта по языку C достаточно, чтобы найти множество ситуаций с неопределенным поведением. Программист Стив Клайн пишет, что в 2026 году никто не способен писать абсолютно корректный C или C++, несмотря на свой тридцатилетний опыт работы с этими языками. Среда разработки и аппаратное обеспечение кардинально изменились с времен 1985 и 1972 годов, и использование C++ в современных условиях может считаться нарушением законов Sarbanes-Oxley. В коде повсюду скрыты тонкие ловушки неопределенного поведения, которые не зависят от оптимизации компилятора. Даже если отключить оптимизацию, компилятор все равно работает с предположением, что ваш код валиден, поэтому может сгенерировать любой код, игнорируя явные намерения разработчика.

Простой пример: доступ к объекту, не имеющему правильной выравниваемости. Если функция возвращает указатель на объект типа int, а передан некорректно выровненный адрес, это вызывает неопределенное поведение. На архитектурах Linux Alpha или SPARC такой код может вызвать падение системы или выгрузку программы, а на x86 срабатывает эмуляция. На архитектурах ARM или RISC-V последствия неизвестны, а будущие процессоры могут использовать специальные регистры для указателей, что нарушит совместимость. Аналогично, операция с атомарными переменами, если объект выровнен неверно, также является неопределенной.

Операции с типами данных полны подвохов. Кастинг из char в int может привести к чтению произвольной памяти, если char является знаковым и значение оказывается отрицательным. Преобразование float в int без проверки диапазона ведет к неопределенному поведению, так как интегральная часть может не помещаться в тип. Сравнение float с INT_MAX также опасно из-за особенностей представления чисел. Хранить объекты по адресу нуля нельзя, так как дизассемблирование ноль-указателя и попытка его вызова — это классическое неопределенное поведение, которое может не совпадать с реальной физической нулевой страницей.

Ошибки в аргументах функции тоже опасны. Передача числа вместо указателя в execl или использование неверного формата в printf с uint64_t приводит к неопределенному поведению, которое может вызвать крах. Деление на ноль, которое все знают, является безопасной мишенью для злоумышленников, использующих ненадежные входные данные. Стандарт C23 содержит 283 упоминания слова «неопределенное», и это еще не считая скрытых проблем, возникающих из-за отсутствия правил.

Ситуация усугубляется тем, что модели искусственного интеллекта гораздо эффективнее людей находит такие ошибки. На код проекта OpenBSD, который считается эталоном надежности, нейросеть указала на множество проблем, включая нарушения границ при записи. Однако проект не всегда принимает подобные правки. Чтобы исправить ситуацию в масштабе, нужны автоматизированные решения, но полагаться исключительно на ИИ рискованно из-за галлюцинаций. Человеческий эксперт необходим для проверки исправлений, но эксперты слишком заняты. Игнорировать неопределенное поведение в C и C++ сегодня без надзора ИИ — это просто безответственно.

Читать оригинал →