Anderson Faustino da Silva

dblp:87/6562 · DBLP profile ↗
← Back
15ranked-venue papers
6as first author
8since 2021 · last 2026
0000-0002-8588-8197ORCID · corroborated

Domains — the database's venue-derived domains; a paper can count in several

Software engineering, systems software and programming languages · 10 · 5 first-author · 6 since 2021Systems, architecture and hardware · 6 · 1 first-author · 5 since 2021Artificial intelligence and machine learning · 2Databases, data management, data science and information retrieval · 2Theory of computation · 2 · 2 first-authorApplied, interdisciplinary, general and emerging computing · 1
YearPublicationVenuePosition
2026 Binary Diffing via Library Signatures
abstract
Binary diffing is the problem of determining whether two binary programs originate from the same source code. Binary diffing tools are used to identify malware, plagiarism, or code theft. Many instances of binary diffing assume an adversarial setting, where a malicious actor transforms binary code by changing the compiler. Traditional diffing techniques rely on statistical similarity analysis, often leveraging stochastic models. However, recent studies have shown that these classifiers perform poorly in the face of adversarial code transformations. To mitigate this scenario, this paper introduces a new diffing technique that is resilient against current obfuscation approaches. We propose comparing executables by matching their library signatures (libsig). A program’s library signature is the sequence of calls it makes to functions outside its .text section. The proposed classifier, LibSIG, is faster than off-the-shelf alternatives, such as ltrace, and, like it, works on stripped binaries or binaries running with address space layout randomization (ASLR) enabled. Furthermore, in contrast to ltrace, LibSIG can be engineered to detect even library calls that bypass conventional application binary interface patterns. Our experiments on the GNU Core Utilities demonstrate that LibSIG remains robust against obfuscators like Khaos and ollvm, as well as typical optimization patterns, outperforming binary diffing approaches such as SAFE, BinDiff, or Asm2Vec.
Andrei Rimsa, Anderson Faustino da Silva, Camilo Santana, Fernando Magno Quintão Pereira
CGO2
2025 DFA-Net: A Compiler-Specific Neural Architecture for Robust Generalization in Data Flow Analyses
abstract
Data flow analysis is fundamental to modern program optimization and verification, serving as a critical foundation for compiler transformations. As machine learning increasingly drives compiler tasks, the need for models that can implicitly understand and correctly reason about data flow properties becomes crucial for maintaining soundness. State-of-the-art machine learning methods, especially graph neural networks (GNNs), face challenges in generalizing beyond training scenarios due to their limited ability to perform large propagations. We present DFA-Net, a neural network architecture tailored for compilers that systematically generalizes. It emulates the reasoning process of compilers, facilitating the generalization of data flow analyses from simple to complex programs. The architecture decomposes data flow analyses into specialized neural networks for initialization, transfer, and meet operations, explicitly incorporating compiler-specific knowledge into the model design. We evaluate DFA-Net on a data flow analysis benchmark from related work and demonstrate that our compiler-specific neural architecture can learn and systematically generalize on this task. DFA-Net demonstrates superior performance over traditional GNNs in data flow analysis, achieving F1 scores of 0.761 versus 0.009 for data dependencies and 0.989 versus 0.196 for dominators at high complexity levels, while maintaining perfect scores for liveness and reachability analyses where GNNs struggle significantly.
Alexander Brauckmann, Anderson Faustino da Silva, Gabriel Synnaeve, Michael F. P. O'Boyle, Jerónimo Castrillón, Hugh Leather
CC2
2025 A Comparative Study on the Accuracy and the Speed of Static and Dynamic Program Classifiers
abstract
Classifying programs based on their tasks is essential in fields such as plagiarism detection, malware analysis, and software auditing. Traditionally, two classification approaches exist: static classifiers analyze program syntax, while dynamic classifiers observe their execution. Although dynamic analysis is regarded as more precise, it is often considered impractical due to high overhead, leading the research community to largely dismiss it. In this paper, we revisit this perception by comparing static and dynamic analyses using the same classification representation: opcode histograms. We show that dynamic histograms---generated from instructions actually executed---are only marginally (4-5%) more accurate than static histograms in non-adversarial settings. However, if an adversary is allowed to obfuscate programs, the accuracy of the dynamic classifier is twice higher than the static one, due to its ability to avoid observing dead-code. Obtaining dynamic histograms with a state-of-the-art Valgrind-based tool incurs an 85x slowdown; however, once we account for the time to produce the representations for static analysis of executables, the overall slowdown reduces to 4x: a result significantly lower than previously reported in the literature.
Anderson Faustino da Silva, Jerónimo Castrillón, Fernando Magno Quintão Pereira
CC1
2023 A Game-Based Framework to Compare Program Classifiers and Evaders
abstract
Algorithm classification consists in determining which algorithm a program implements, given a finite set of candidates. Classifiers are used in applications such malware identification and plagiarism detection. There exist many ways to implement classifiers. There are also many ways to implement evaders to deceive the classifiers. This paper analyzes the state-of-the-art classification and evasion techniques. To organize this analysis, this paper brings forward a system of four games that matches classifiers and evaders. Games vary according to the amount of information that is given to each player. This setup lets us analyze a space formed by the combination of nine program encodings; seven obfuscation passes; and six stochastic classification models. Observations from this study include: (i) we could not measure substantial advantages of recent vector-based program representations over simple histograms of opcodes; (ii) deep neural networks recently proposed for program classification are no better than random forests; (iii) program optimizations are almost as effective as classic obfuscation techniques to evade classifiers; (iv) off-the-shelf code optimizations can completely remove the evasion power of naïve obfuscators; (v) control-flow flattening and bogus-control flow tend to resist the normalizing power of code optimizations.
Thaís Damásio, Michael Canesche, Vinícius Pacheco, Marcus Botacin, Anderson Faustino da Silva, Fernando Magno Quintão Pereira
CGO5
2023 Fast selection of compiler optimizations using performance prediction with graph neural networks
abstract
Abstract Tuning application performance on modern computing infrastructures involves choices in a vast design space as modern computing architectures can have several complex structures impacting performance. Moreover, different applications use these structures in different ways, leading to a challenging performance function. Consequently, it is hard for compilers or experts to find optimal compilation parameters for an application that maximizes such performance function. One approach to tackle this problem is to evaluate many possible optimization plans and select the best among them. However, executing an application to measure its performance for every plan can be very expensive. To tackle this problem, previous work has investigated the use of Machine Learning techniques to predict the performance of the applications without executing them quickly. In this work, we evaluate the use of graph neural networks (GNN) to make fast predictions without executing the application to guide the selection of good optimization sequences. We propose a GNN architecture to make such predictions. We train and test it using 30 thousand different compilation plans applied to 300 different applications, using ARM64 and LLVM IR code representations as input. Our results indicate that the control and data flow graph can then learn features from the control and data flow graph to outperform nongraph‐aware Machine Learning models. Our GNN architecture achieved 91% accuracy in our dataset compared to 79% when using a nongraph‐aware architecture–taking only 16ms to predict a given input. If the application been optimized took an average of 10 s to execute, and we evaluated 1000 optimization sequences, it would take almost 9 h to assess all pairs, but only 16 s with our GNN .
Vanderson Martins do Rosário, Anderson Faustino da Silva, André Felipe Zanella, Otávio O. Napoli, Edson Borin
Concurr. Comput. Pract. Exp.2
2021 Exploring the space of optimization sequences for code-size reduction: insights and tools
abstract
The optimization space of a compiler is the set of every possible sequence of optimizations that said compiler can use. The exploration of the optimization space of any mainstream compiler has been, for decades, hampered by the lack of benchmarks. However, recent efforts from different research groups have made available a large quantity of compilable code that can be, today, used to overcome this problem. In this paper, we use 15,000 programs from a public collection to explore the optimization space of LLVM, focusing on code-size reduction. This exploration reveals that the probability of beating the default optimization levels of LLVM with random sequences ranges from 10% (considering opt -Oz) to 19% (considering clang -Os). Yet, the distribution of probabilities is uneven across programs: the default levels work well for most programs, and poorly for a few. Based on these observations, we introduce the notion of an Optimization Cache, a table of programs to optimization sequences that can be used to support predictive compilation. We then use an optimization cache to build what we call a Default Covering Set: a small ensemble of optimization sequences that, once combined, tend to be good for any program. Optimization caches and default covering sets are used independently. The former, when applied onto MiBench, yield programs that are 11.9% smaller than programs produced by opt -Os, on average. The latter produce programs 12.5% smaller.
Anderson Faustino da Silva, Bernardo N. B. de Lima, Fernando Magno Quintão Pereira
CC1
2021 ANGHABENCH: A Suite with One Million Compilable C Benchmarks for Code-Size Reduction
abstract
A predictive compiler uses properties of a program to decide how to optimize it. The compiler is trained on a collection of programs to derive a model which determines its actions in face of unknown codes. One of the challenges of predictive compilation is how to find good training sets. Regardless of the programming language, the availability of human-made benchmarks is limited. Moreover, current synthesizers produce code that is very different from actual programs, and mining compilable code from open repositories is difficult, due to program dependencies. In this paper, we use a combination of web crawling and type inference to overcome these problems for the C programming language. We use a type reconstructor based on Hindley-Milner's algorithm to produce ANGHABENCH, a virtually unlimited collection of real-world compilable C programs. Although ANGHABENCH programs are not executable, they can be transformed into object files by any C compliant compiler. Therefore, they can be used to train compilers for code size reduction. We have used thousands of ANGHABENCH programs to train YACOS, a predictive compiler based on LLVM. The version of YACOS autotuned with ANGHABENCH generates binaries for the LLVM test suite over 10% smaller than clang -Oz. It compresses code impervious even to the state-of-the-art Function Sequence Alignment technique published in 2019, as it does not require large binaries to work well.
Anderson Faustino da Silva, Bruno Conde Kind, José Wesley de S. Magalhães, Jerônimo Nunes Rocha, Breno Campos Ferreira Guimarães, Fernando Magno Quintão Pereira
CGO1
2021 Smart selection of optimizations in dynamic compilers
abstract
Summary Dynamic compilers perform compilation and generation of target code during runtime, implying that the compilation time is added into the program runtime. Thus, to build a high‐performing dynamic compilation system, it is crucial to be able to generate high‐quality code and, at the same time, have a small compilation cost. In this article, we present an approach that uses machine learning to select sequences of optimization for dynamic compilation that considers both code quality and compilation overhead. Our approach starts by training a model, offline, with a knowledge bank of those sequences with low overhead and high‐quality code generation capability using a genetic heuristic. Then, this bank is used to guide the smart selection of optimizations sequences for the compilation of code fragments during the emulation of an application. We evaluate the proposed strategy in two LLVM‐based dynamic binary translators, namely OI‐DBT and HQEMU, and show that these two translators can achieve average speedups of 1.26x and 1.15x in MiBench and Spec Cpu benchmarks, respectively.
Vanderson Martins do Rosário, Anderson Faustino da Silva, Thais Aparecida Silva Camacho, Otávio O. Napoli, Maurício Breternitz, Edson Borin
Concurr. Comput. Pract. Exp.2
2018 Yet Another Intelligent Code-Generating System: A Flexible and Low-Cost Solution
João Fabrício Filho, Luis Gustavo Araujo Rodriguez, Anderson Faustino da Silva
J. Comput. Sci. Technol.3
2015 The use of different strategies of search space reduction in mitigation of optimization selection problem
abstract
Compiler optimizations are transformations that are applied on the source code to improve its performance. Many times its a complex task choose which optimizations set must be used, so, usually are chosen optimization levels given by the compiler. However, this optimization levels not always are good enough to all programs. Thus, is needed to search for sets to improve specific programs. Currently the Best10 algorithm one of the best algorithms to mitigate the optimizations selection problem. This algorithm require one reduced search space to infer which are the optimization sets that must be applied during the compilation of programs. This work present the impact of the use of different search space creation strategies used by the Best10 algorithm. The results shows that sophisticated strategies do not always provide the best results.
Nilton Luiz Queiroz Junior, Anderson Faustino da Silva
CLEI2
2015 Improved batch elimination: A fast algorithm to identify and remove harmful compiler optimizations
abstract
Modern compilers provide several optimizations that can be applied to the source code, in order to increase its performance. Due to the complex relationship between various optimizations, discovering harmful compiler optimizations is a problem in the context of compilers. Strategies based on iterative compilation try to solve this problem evaluating the performance of the compiled program using different sets. In this context, Combined Elimination is an efficient iterative compilation strategy. The purpose of Combined Elimination is to identify the harmful optimizations and remove them in an iterative compilation process. Combined Elimination provides good results, which are close to those founded by an exhaustive search approach. However, its drawback is the number of program runs. In this paper, we proposed an iterative compilation algorithm, named Improved Batch Elimination. This algorithm is based on the first step towards Combined Elimination, the Batch Elimination algorithm. The goal of Improved Batch Elimination is to produce results similar to Combined Elimination, with a complexity similar to Batch Elimination. In other words, the goal is to produce good results and to be faster than Combined Elimination. We evaluate our algorithm by measuring the performance of Spec Cpu2006, Polybench and cBench benchmarks under a set of llvm compiler optimizations. The results indicate that Improved Batch Elimination is a good strategy to remove harmful compiler optimizations, using few program runs.
Ewerton Daniel de Lima, Anderson Faustino da Silva
CLEI2
2007 Design, Implementation, and Evaluation of a Dynamic Compilation Framework for the YAP System
Anderson Faustino da Silva, Vítor Santos Costa
ICLP1
2006 The Design and Implementation of the YAP Compiler: An Optimizing Compiler for Logic Programming Languages
Anderson Faustino da Silva, Vítor Santos Costa
ICLP1
2003 A New Distributed JVM for Cluster Computing
Marcelo Lobosco, Anderson Faustino da Silva, Orlando Loques, Claudio Luis de Amorim
Euro-Par2
2003 An Evaluation of cJava System Architecture
abstract
We propose a new distributed run-time environment, which we called cJava, that enables multithread Java applications to execute in clusters transparently. Our implementation of cJava supports the distributed shared memory (DSM) which required significant extensions to the original Java virtual machine (JVM). First, a distributed object manager was incorporated to the JVM's memory management subsystem for creating a global object space. Second, synchronized accesses to the global object space were extended so that they could use the lock() and unlock() primitives that cJava's DSM supports. Third, cJava adapted the thread subsystem to enable remote creation and global monitors. Last, a subsystem/or remote signaling was added to the original JVM. The main advantage of cJava is that it can execute existing multithread Java applications straightaway. Most importantly, our results of cJava's performance across several benchmarks show that cJava offers an efficient run-time system for executing transparently multithread Java applications in clusters.
Anderson Faustino da Silva, Marcelo Lobosco, Claudio Luis de Amorim
SBAC-PAD1