LINUX.ORG.RU

Релиз Clang с новой технологией проверки безопасности кода

 , ,


0

2

Увидел свет новый выпуск являющегося частью проекта LLVM компилятора Clang с технологией SAFECode.

Данная технология предназначена для отслеживания возможных проблем работы с памятью в разрабатываемом приложении, при этом не изменяет поведение компилятора, когда неактивна. Включить её можно через указание специального ключа командной строки при сборке. Преимуществами по сравнению с таким инструментом как Valgrind являются:

  • более информативные сообщения об ошибках;
  • возможность оптимизации некоторых run-time проверок;
  • отсутствие динамической трансляции как у Valgrind;
  • более точно определяет структуру программы, так как знает расположение границ отдельного стека и глобальных объектов (для поиска данных границ Valgrind использует эвристические методы).

Сейчас технология позволяет отслеживать разыменования указателей, которые могут спровоцировать переполнение буфера. В дальнейшем планируется внести из проекта SAFECode в Clang:

  • выявление некорректного доступа к памяти (указатели на несуществующий или удаленный объект);
  • определение неправильных вызовов функции free(), например, двойное освобождение выделенной памяти;
  • определение использования неинициализированных указателей;
  • выявление ошибок при работе с памятью, вызванных неправильным использованием функций стандартной библиотеки;
  • дополнительные оптимизации, включая удаление проверок корректности типов на этапе загрузки/сохранения и вынос за пределы циклов.

Clang это фронт-энд компиляторов С/С++, Objective-C, который разрабатывается на замену GCC в BSD-системах. Интересен может быть также крупным корпорациям благодаря лицензии BSD. При помощи Clang уже удалось собрать ядро Linux и фреймворк Qt.

Исходный код

Страница проекта

>>> Подробности

★★★★★

Проверено: JB ()
Последнее исправление: Dendy (всего исправлений: 5)
Ответ на: комментарий от anonymous

Было уже - GCC-XML. И где оно сейчас? А еще есть несколько проектов (GCCSense например), предусматривающих наложение на GCC патчей и его пересборку - не очень удобное решение.

Deleted
()
Ответ на: комментарий от tailgunner

> умерло, но кое-где еще используется

fixed

aho
()
Ответ на: комментарий от Deleted

Какой такой GCC-XML? Поверх GCC много настоящих реализаций. static code analysis.

Ты вообще осознаешь, как любой подобный анализатор работает? Он в себя не только полный компилятор должен включать, но и линкер.

anonymous
()
Ответ на: комментарий от tailgunner

>> Было уже - GCC-XML. И где оно сейчас?

Живо и работает.


Главная его проблема, как и любых других сторонних патчей, затрагивающих потроха gcc или его промежуточное представление, — результат работы будет под GPLv3.

Да-да, результат работы компилятора будет под GPLv3 независимо от воли автора компилируемого кода.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

> Главная его проблема, как и любых других сторонних патчей, затрагивающих потроха gcc или его промежуточное представление, — результат работы будет под GPLv3.

И ты, конечно, можешь предоставить пруф?

tailgunner ★★★★★
()
Ответ на: комментарий от baka-kun

результат работы компилятора будет под GPLv3 независимо от воли автора компилируемого кода.

Это правда? И почему gcc до сих пор не заменили таким замечательным компилятором?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от baka-kun

> результат работы будет под GPLv3.

Бред. GCC Runtime Library Exception гарантирует, что «if you use GCC, with or without GPL-compatible enhancements, that would be an Eligible Compilation Process».

anonymous
()
Ответ на: комментарий от tailgunner

> И ты, конечно, можешь предоставить пруф?

По-моему, уже тысячу раз обсасывали.

Начиная с того, что за gcc таскается GCC Runtime, части которого «are automatically used by the object code that GCC produces», а сам exception упирается в «Eligible Compilation Processes». При этом явно заявляется, что любое промежуточное представление НЕ является результатом компиляции.

Продолжая тем, что rms, не посоветовавшись с юристами, договорился до того, что компилируя i = 2 + 2; gcc инлайнит собственную реализации «2 + 2» (которая под GPLv3), поэтому любой скомпилированный код — производная работа («since all binaries are derivative of GCC anyway…»), а поэтому только великой милостию Его исключения нам позволено использовать наш собственный код.

Заканчивая тем, что gcc специально предпринимает шаги, чтобы результат работы компилятора оказался производной работой. rms так борется с проприетарными плагинами: без этого никто не мешает вытащить IR, оптимизировать «супер-пупер качественными закрытыми алгоритмами» и впихнуть обратно. Результат будет лучше, чем у «просто gcc», а руки на оптимизатор не наложишь. Целая команда несколько лет решала эту «проблему» (Eben Moglen, David Edelsohn и т.д.).

Собственно, вся проблема началась именно из-за страха, что кто-то улучшит gcc. Доигрались до того, что на подходе уже пара коммпиляторов, которые архитектурно лучше, да LLVM, который вообще из другой лиги.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

> Начиная с того, что за gcc таскается GCC Runtime

...которое под «заразной» GPL (то есть обычное заражение через линковку), из-за чего и понадобилось GCC Runtime Library Exception.

Начиная с того, что за gcc таскается GCC Runtime, части которого «are automatically used by the object code that GCC produces», а сам exception упирается в «Eligible Compilation Processes»

И?

«A Compilation Process is „Eligible“ if it is done using GCC, alone or with other GPL-compatible software, or if it is done without using any work based on GCC. For example, using non-GPL-compatible Software to optimize any GCC intermediate representations would not qualify as an Eligible Compilation Process.»

Обрати внимание, специально заявлено: «using non-GPL-compatible Software to optimize any GCC intermediate representations would not qualify as an Eligible Compilation Process». Не сказано, что, промежуточное представление автоматически попадает под GPL (как утверждаешь ты).

Более того, прямо заявлено, что: «even if someone writes a plugin that saves this information to disk, any programs that change the structures before GCC writes out Target Code will be involved in the Compilation Process. If that program is proprietary, the exception will not be available to any software compiled with it».

Что непонятно во фразе «if that program is proprietary»? Пока все инструменты, работающие над выданным промежуточным представлением, GPL-совместимы, процесс компиляции является eligible.

gcc специально предпринимает шаги, чтобы результат работы компилятора оказался производной работой. rms так борется с проприетарными плагинами

Да, и что? Ты утверждаешь буквально следующее:

baka-kun> результат работы компилятора будет под GPLv3

А цель в том, чтобы сохранить иметь под GPL всё, что работает над промежуточным представлением. Не само промежуточное представление, а именно инструменты работы с ним.

Короче, то, что ты сказал, строго говоря, неверно, а говоря щире - FUD.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> И?

Что «И?»?

Исключение покрывает только случай использования оригинального gcc, с опциональной модификацией IR сторонним GPL-compatible ПО (плагином, внешней по отношению к gcc сущностью).

Если используется производная от gcc работа (gcc-xml, например), то всё — приплыли: исключение работает только «if it is done without using any work based on GCC». Заметь: «any»!

результат работы компилятора оказался производной работой

Да, и что?

Да нет, ничего. Это как если бы сжатие GNU zip или форматирование GNU indent делало содержимое производной работой.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

> Исключение покрывает только случай использования оригинального gcc, с опциональной модификацией IR сторонним GPL-compatible ПО

Нет.

Цитата с http://www.gnu.org/licenses/gcc-exception-faq.html : «if you use GCC, with or without GPL-compatible enhancements, that would be an Eligible Compilation Process». Т.е. ты можешь использовать модифицированный GCC - как раз случай GCC-XML.

Если используется производная от gcc работа (gcc-xml, например), то всё — приплыли: исключение работает только «if it is done without using any work based on GCC». Заметь: «any»!

Нет.

Цитата с http://www.gnu.org/licenses/gcc-exception.html : «Compilation Process is „Eligible“ if it is done using GCC, alone or with other GPL-compatible software». Заметь «alone or with other GPL-compatible». GCC-XML вполне GPL-compatible, так что и с этой стороны исключение в силе.

Это как если бы сжатие GNU zip или форматирование GNU indent делало содержимое производной работой.

FUD.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Нет.

Да. Если ты считаешь, что я не прав, то потребуется доказать утверждение: «gcc-xml — это GCC».

Я же утверждаю, что gcc-xml — это производная работа, work based on GCC.

Compilation Process is «Eligible» if it is done using GCC, alone or with other GPL-compatible software". Заметь «alone or with other GPL-compatible

Не забудь добавить «if it is done without using any work based on GCC».

Перевожу:

Если использовался только GCC, либо GCC совместно с другим GPL-ПО, либо совсем не использовалось любое производное от GCC ПО, то это нам подходит, возьми конфетку.

FUD

Покажи мне другой компилятор, который накладывает ограничение на оттранслированный им код.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

> Если ты считаешь, что я не прав, то потребуется доказать утверждение: «gcc-xml — это GCC».

Ничего подобного доказывать не нужно. Любой GPL-совместимый инструмент сохраняет процесс Eligible.

Compilation Process is «Eligible» if it is done using GCC, alone or with other GPL-compatible software". Заметь «alone or with other GPL-compatible

Не забудь добавить «if it is done without using any work based on GCC».

Давай-ка полную цитату, с источником.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Ничего подобного доказывать не нужно.

Нужно, поскольку исключение прямо говорит: либо используй для компиляции целиком gcc, возможно в комплекте с другими GPL-совместимыми утилитами (плагинами), либо не используй никаких производных от gcc работ совсем.

На входе компиляции должен быть исходник, а на выходе обязан быть только готовый бинарник или код ассемблера (то, что отдается ассемблеру, линкеру или загрузчику). Никакие промежуточные данные работы gcc результатом компиляции не являются в любом виде, и их использование отдельно нарушает исключение.

Давай-ка полную цитату, с источником.

Прочитай уже наконец само исключение, а не путанные комментарии, которые регулярно правят.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

> прямо говорит: либо используй для компиляции целиком gcc, возможно в комплекте с другими GPL-совместимыми утилитами (плагинами), либо не используй никаких производных от gcc работ совсем.

Оно говорит, что ты имеешь право использовать модифицированный GCC. если модифиуации GPL-совместимы. Приведу цитату последний раз - на случай, что ты просто ошибаешься, а не залочил мозги по религиозным причинам:

«if you use GCC, with or without GPL-compatible enhancements, that would be an Eligible Compilation Process»

Давай-ка полную цитату, с источником.

Прочитай уже наконец само исключение

Я его читал и цитировал.

</thread>

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> ты имеешь право использовать модифицированный GCC

Я бы сейчас пустился в рассуждения, что «модифицированный GCC» и «работа, основанная на GCC» — это две большие разницы (юридически это так), и что gcc-xml явно является вторым, но пока не буду.

Я лучше удивлюсь: это ты где такую цитату взял? Исключение говорит немного другое:

«A Compilation Process is «Eligible» if it is done using GCC, alone or with other GPL-compatible software, or if it is done without using any work based on GCC».

Давай основывать свои аргументы на оригинале, а не том, что «Моня напел».

baka-kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.