C Язык (проект) предложение, включающее общие функции и параметрические типы в C; Прототип доступен здесь.
Psyche-C-это фронт компилятора для языка C. Он разработан как библиотека, с акцентом на реализацию инструментов статического анализа программ C, не требуя понимания их настройки сборки. Беллои являются основными характеристиками Psyche-C:
struct , union , enum и typedef (из -за сбоев #include ).Родный API Psyche-C находится в C ++, но запланированы API для других языков.
void analyse ( const SourceText& srcText, const FileInfo& fi)
{
ParseOptions parseOpts;
parseOpts. setAmbiguityMode (AmbiguityMode::DisambiguateAlgorithmically);
auto tree = SyntaxTree::parseText (srcText,
TextPreprocessingState::Preprocessed,
TextCompleteness::Fragment,
parseOpts,
fi. fileName ());
auto compilation = Compilation::create ( " code-analysis " );
compilation-> addSyntaxTree (tree. get ());
AnalysisVisitor analysis (tree. get (), compilation-> semanticModel (tree. get ()));
analysis. run (tree-> translationUnitRoot ());
}SyntaxVisitor::Action AnalysisVisitor::visitFunctionDefinition ( const FunctionDefinitionSyntax* node) override
{
const sym = semaModel-> declaredSymbol (node);
if (sym-> kind () == SymbolKind::Function) {
const FunctionSymbol* funSym = sym-> asFunction ();
// ...
}
return Action::Skip;
}
Psyche-C поставляется с драйвером Cnippet , и его можно использовать в качестве обычного анализатора для фрагментов C. Например, если вы скомпилируете фрагмент ниже с Cnippet , вы увидите диагностику, похожую на тот, который вы увидите с GCC или Clang.
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psyche-C может при желании (до сих пор доступно только в исходной ветви) вывести недостающие типы фрагмента C. Например, для приведенного ниже фрагмента Psyche-C может сделать вывод (компиляруемый) объявление для T и синтезирования его во время компиляции.
void f ()
{
T v = 0 ;
v -> value = 42 ;
v -> next = v ;
} typedef struct TYPE_2__ TYPE_1__ ;
struct TYPE_2__
{
int value ;
struct TYPE_2__ * next ;
} ;
typedef TYPE_1__ * T ;Вы можете использовать эту функциональность для:
За исключением типового вывода, который написан в Haskell, Psyche-C написан в C ++ 17; Cnippet написан на Python 3.
Построить:
cmake CMakeLists.txt && make -j 4
Чтобы запустить тесты:
./test-suite
Самого психики-c:
Тип вывод для C: приложения для статического анализа неполных программ
Транзакции ACM на языках и системах программирования - Toplas , том 42, выпуск 3, статья № 15, декабрь 2020 года.
Вывод статической семантики для неполных программ C
Материалы ACM по языкам программирования, том 2, выпуск Popl , январь 2018 г., статья № 29.
Которые используют Psyche-C:
Slade: портативный декомпилятор с малым языком для оптимизированной сборки
Материалы Международного симпозиума IEEE/ACM по генерации и оптимизации кода - CGO , 2024.
Anghabench: набор с миллионом компиляруемых C-тестов для сокращения размера кода
Материалы Международного симпозиума IEEE/ACM по генерации и оптимизации кода - CGO , 2021.
Генерация входных входов для массивов на языках памяти-UNSAFE
Материалы Международного симпозиума IEEE/ACM по генерации и оптимизации кода - CGO , февраль 2019 г., с. 136-148.
Автоматическая аннотация задач в структурированном коде
Материалы Международной конференции по параллельным архитектурам и методам компиляции - Пакт , ноябрь 2018 г., статья № 31.