Я фокусируюсь на микропифоне, а именно на ветке динамико-нативные-модули.
Эта функция в будущем позволит вам скомпилировать функцию C / C ++ в нативный .obj
и упаковать его вместе с .py
интерфейс для огромного ускорения.
Потрясающие! Но проблема в том, что если вы используете ОСРВ, который не имеет виртуальной памяти, тогда любой исполняемый собственный код может получить доступ к любой части адресного пространства, включая периферийные устройства, состояние ОСРВ и т. д.
Вы не хотите, чтобы пользователь мог делать что-то вроде этого:
void user_func()
{
/* point to arbitrary memory, potentially the reset registers, flash erase . . . you get the point */
int * a = (int*)0x1234;
*a = 0x10110000; // DESTROY!!!
}
Даже следующее должно быть запрещено:
void user_func()
{
int a;
(int*)(&a-1000) = 0x10010111;
}
РЕШЕНИЯ?
gcc
(для каждого двоичного формата) .obj
файлы и обнаружение использования указателей (для каждого двоичного двоичного формата)ОБРАТНАЯ СВЯЗЬ К КОММЕНТАРИЯМ
Я понимаю, что это может быть невозможно остановить злонамеренный пользователь, но это не беспокойство № 1. Мы хотим остановить благие, но случайные коды. Если невозможно остановить каждый отдельный случай, это Хорошо.
Если мы сможем запретить / обнаружить явные обращения к указателю и просто предоставить предупреждения относительно использования массива, это все еще очень ценно.
ПРЕДУПРЕЖДЕНИЕ: Вы используете массив! УБЕДИТЕСЬ, ЧТО ВЫ НЕ ВЫХОДИТЕ ИЗ-ЗА ПУНКТОВ
Ваш лучший шанс — плагин GCC, который смотрит на сгенерированный интерфейс GENERIC или же GIMPLE IRs и реализует политики, которые вы хотите. В зависимости от политик и исходного кода, который вы хотите принять, это может быть много работы и очень сложно.
Если вам нужен чисто синтаксический или основанный на типах подход (просто отклоняющий всю арифметику указателей), с Clang с его AST легче работать, чем с GCC.
Там может быть способ делать то, что вы хотите — пока вы защищаете от честных ошибок, а не преднамеренных попыток сломать вещи.
Во-первых, вы принимаете основные принципы C ++ и используете поддержку инструментов: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-tools
Для ваших целей он не позволит вашему коду использовать необработанные указатели и арифметику указателей в небиблиотечном коде. Период. Основные рекомендации делают больше, но это то, что связано с вашим вопросом.
Затем вы делаете простой grep в коде, чтобы убедиться, что он не использует указатели, наделенные руководящими указаниями — это будет более или менее простым grep
,
На практике это не представляется возможным.
Вы можете изменить компиляцию (например, с помощью плагина GCC, как указано в Ответ Флориана Ваймера) проверять каждый доступ к массивам, но это делает сгенерированный код значительно медленнее. Ваше нативное оборудование достаточно медленное, вы не хотите делать его еще медленнее.
И Python не совсем правильный исходный язык. Его динамическая типизация сделает его довольно медленным.
Возможно, вы могли бы рассмотреть статически типизированный язык, такой как Ocaml (в сочетании с библиотекой компиляции JIT или AOT, такой как GCCJIT, так далее). Система типов (и ее вывод) повышают безопасность (и скорость) сгенерированного кода, и с большой трудоемкостью (несколько лет, вероятно, стоит PhD
поскольку вам потребуется провести новое исследование), вы можете улучшить вывод типов, чтобы даже вывести случаи, когда индекс массива никогда не выходит за пределы (и проверка границы индекса даже не требуется).
В большинстве случаев обновление аппаратного обеспечения (до стиля Raspberry Pi с MMU и, возможно, возможностью иметь настоящую ОС с некоторым количеством виртуальной памяти), вероятно, является наиболее прагматичным подходом.
PS. Быть осведомленным Теорема Райса. Большинство статических источников анализа не могут работать надежно и хорошо (быть обоснованным и полным, с технической точки зрения).