diff --git a/notas b/notas new file mode 100644 index 0000000000000000000000000000000000000000..d4d54a760d7bf8aa91e3dbd456a14e856d29a211 --- /dev/null +++ b/notas @@ -0,0 +1,41 @@ +criar uma representação do grafo a partir do DOT + dot -Tpng <arquivo>.dot -o <arquivo>.png && eog <arquivo>.png + +linguagem c: +testado o compilador do gcc com as flags -fdump-tree-cfg-graph e após isso, usado o .dot gerado para criar a visualização do grafo +para gerar uma matriz de adjacencia foi usado o dotmatrix, um conversor de .dot para uma matriz de adjacencia (é necessário retirar o lixo do .dot gerado para o input do dotmatrix, normalmente as últimas linhas apenas que são importantes) + +não há muitas opções de geradores de GFC a partir de arquivos .c, e não foi achado nada que converta um código .c diretamente em uma matriz/lista de adjacencia a partir do CFG do mesmo (só com essa maracutaiazinha que eu consegui). + +python: +para o python foi testado pycfg e staticfg, de antemão os dois criam grafos mais fáceis de entender do que o do gcc. + +pycfg: +depois de instalar o pycfg, usa-se esse comando: + python <caminho-para-pycfg>/pycfg-0.1/pycfg/pycfg.py exemplos/2.py -d 2> <arquivo DOT de saida> + + +staticfg: +depois de instalar o staticfg,, usa-se esse comando (dentro do diretório ../staticfg/): + python <caminho-para-staticfg>/examples/build_cfg.py <arquivo de entrada> <arquivo de saida> + +o build_cfg.py gera um cfg em um pdf e também cria um arquivo dot. As arestas são mais descritivas do que a outra opção, o que ajuda em casos no qual quer saber se a condicional foi satisfeita ou não (se o if foi pra direita ou pra esquerda). + +Foi testado os arquivos dot gerados pelas três opções. Os tres foram submetidos ao dotmatrix e retornaram matrizes de adj. condizentes com o grafo de fluxo de controle esperado. (O arquivo DOT do staticfg é mais legível se deixar apenas com as linhas com "->" e sem as relações de chamada de função, talvez eu crie algo para automatizar isso) + +A diferença entre eles é a quantidade de informação dentro de cada vértice, os tres são úteis para gerar a matriz de adjacência, mas o pycfg é mais útil para entender o que está acontecendo no código, já que mostra o número da linha, coisa que o staticfg não apresenta. + +Comparações em trechos de código: +O arquivo DOT apresenta as labels dos vértices como as suas respectivas linhas de código. + +Uma ideia é gerar a string de isomorfismo de cada código e caso sejam diferentes em apenas um trecho, apresentar as strings de cada label para o usuário. +Por exemplo: +se há um codigo com um bloco sequencial dentro de um if-else e; +um código com um loop dentro de um if-else; +teremos dois grafos que não são isomórficos mas que são muito parecidos. + +Apresentar o excesso e a falta de um bloco de código para o usuário pode ajudar a entender o que está acontecendo, algo bem parecido com as comparações de versionamento de código. (provavelmente uma concatenação das labels funcione). + +Caso sejam isomórficos, fazer uma comparação de labels e apresentar as diferenças. + +Numa comparação de códigos, talvez seja melhor apresentar a opção em python. \ No newline at end of file