Краткая версия Я попросил конечную точку бесплатной модели реализовать небольшой анализатор C++ для значений заголовка Content-Disposition. Каждый вывод проходил через трехэтапный шлюз на бесплатном сервере: компиляция предупреждений как ошибок, ASan/UBSan и дифференциальная...
Краткая версия
Я попросил конечную точку бесплатной модели реализовать небольшой анализатор C++ для значений заголовка Content-Disposition. Каждый вывод проходил через трехэтапный шлюз на бесплатном сервере: компиляция предупреждений как ошибок, ASan/UBSan и дифференциальное тестирование с помощью рукописного эталонного оракула. В первом раунде не удалось 12 из 5000 созданных случаев. Раунд 2 провалился. 7. Раунд 3 пройден, включая повторный запуск на 20 000 случаев с другим исходным числом.
Неудачи были интереснее зеленого результата. Все они находились на границах грамматики: конец ввода, экранированные кавычки, пустые строки в кавычках и байты obs-текста. Ни один из них не появился бы в типичном обзоре «компилирует ли он и обрабатывает ли этот пример».
Предыстория: зачем нужен парсер заголовков
Content-Disposition выглядит просто: токен типа, затем параметры, разделенные точкой с запятой, например filename="report.pdf". Ловушка — это строковая грамматика в кавычках из RFC 9110 в сочетании с RFC 6266. Внутри кавычек могут быть пробелы, табуляции, байты obs-текста (0x80-0xFF) и escape-слэши. Экранированная кавычка не завершает строку. Незавершенная строка является синтаксической ошибкой.
Эта грамматика достаточно мала, чтобы ее можно было тщательно проверить с помощью дифференциального тестирования, и достаточно сложна, чтобы сгенерированный код мог