C Language (rascunho) Proposta ativando funções genéricas e tipos paramétricos em c; protótipo disponível aqui.
Psyce-C é um front-end do compilador para o idioma C. Ele foi projetado como uma biblioteca, com foco na implementação de ferramentas de análise estática dos programas C, sem exigir a compreensão de sua configuração de construção. Abaixo são as principais características do Psyche-C:
struct ausente, union , enum e typedef (devido a falhas #include ).A API nativa do PsyCE-C está em C ++, mas as APIs para outros idiomas são planejadas.
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;
}
O PsyCE-C vem com o motorista do CNIPPET e pode ser usado como um analisador comum para trechos C. Por exemplo, se você compilar o trecho abaixo com o CNIPPET , verá um diagnóstico semelhante ao que veria com o GCC ou CLANG.
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psype-C pode opcionalmente (até agora disponível apenas na filial original) inferir os tipos ausentes de um trecho C. Por exemplo, para o trecho abaixo, Psyche-C pode inferir uma declaração (compilável) para T e sintetizá-lo durante a compilação.
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 ;Você pode querer usar essa funcionalidade para:
Exceto pela inferência do tipo, que está escrito em Haskell, Psyche-C é escrito em C ++ 17; CNIPPET está escrito em Python 3.
Para construir:
cmake CMakeLists.txt && make -j 4
Para executar os testes:
./test-suite
Do próprio Psyche-C:
Digite inferência para C: Aplicações para a análise estática de programas incompletos
Transações da ACM em linguagens e sistemas de programação - TOPLAS , Volume 42, Edição 3, Artigo nº 15, dezembro de 2020.
Inferência de semântica estática para programas C incompletos
Anais da ACM em linguagens de programação, volume 2, Issue Popl , janeiro de 2018, artigo nº 29.
Que usam psicé-c:
SLADE: Um modelo portátil de modelo de idioma portátil para montagem otimizada
Anais do Simpósio Internacional IEEE/ACM sobre Geração e Otimização de Código - CGO , 2024.
Anghabench: uma suíte com um milhão de benchmarks C compiláveis para redução de tamanho de código
Anais do Simpósio Internacional IEEE/ACM sobre Geração e Otimização de Código - CGO , 2021.
Geração de entradas internas para matrizes em idiomas de memória não segura
Anais do Simpósio Internacional IEEE/ACM sobre Geração e Otimização de Código - CGO , fevereiro de 2019, p. 136-148.
Anotação automática de tarefas em código estruturado
Anais da Conferência Internacional sobre Arquiteturas Paralleas e Técnicas de Compilação - Pacto , novembro de 2018, Artigo nº 31.