Saumya K. Debray

dblp:d/SKDebray · also Saumya Debray · DBLP profile ↗
← Back
73ranked-venue papers
29as first author
4since 2021 · last 2025
—ORCID · none

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

Software engineering, systems software and programming languages · 48 · 23 first-author · 1 since 2021Security and privacy · 11 · 1 since 2021Theory of computation · 11 · 6 first-authorSystems, architecture and hardware · 5 · 1 since 2021Databases, data management, data science and information retrieval · 2 · 1 first-authorHuman-computer interaction and ubiquitous computing · 2 · 2 first-authorApplied, interdisciplinary, general and emerging computing · 2 · 1 first-authorArtificial intelligence and machine learning · 1 · 1 since 2021

Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.

Interdisciplinary, comprehensive, and emerging computing
1 paper
Computing education · 75% Computational science and engineering · 25%
Software engineering, system software, and programming languages
25 papers
Program analysis · 81% Compilers and program optimization · 14% Programming languages and type systems · 4%
Network and information security
10 papers
Malware analysis · 56% Systems and software security · 34% Cryptographic primitives and cryptanalysis · 6%
Databases, data mining, and information retrieval
1 paper
Database system architecture and tuning · 50% Query processing and optimization · 50%

Topics — the 30 heaviest of 73, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Computing education › ethics education
academic integrity
0.812024
Impeding LLM-assisted Cheating in Introductory Programming Assignments via Adversarial Perturbation · EMNLP 2024
Computational science and engineering
code generation
0.812024
Impeding LLM-assisted Cheating in Introductory Programming Assignments via Adversarial Perturbation · EMNLP 2024
Computing education › programming education
introductory programming
0.812024
Impeding LLM-assisted Cheating in Introductory Programming Assignments via Adversarial Perturbation · EMNLP 2024
Computing education
programming education
0.812024
Impeding LLM-assisted Cheating in Introductory Programming Assignments via Adversarial Perturbation · EMNLP 2024
Program analysis
dynamic analysis
0.622020
Representing and Reasoning about Dynamic Code · ASE 2020
Deobfuscation of virtualization-obfuscated software: a semantics-based approach · CCS 2011
Program analysis › static analysis
dependency analysis
0.412020
Representing and Reasoning about Dynamic Code · ASE 2020
Program analysis › static analysis
information flow analysis
0.412020
Representing and Reasoning about Dynamic Code · ASE 2020
Systems and software security
binary analysis
0.212015
A Generic Approach to Automatic Deobfuscation of Executable Code · IEEE Symposium on Security and Privacy 2015
Malware analysis › obfuscation analysis
code deobfuscation
0.212015
A Generic Approach to Automatic Deobfuscation of Executable Code · IEEE Symposium on Security and Privacy 2015
Malware analysis › obfuscation analysis
obfuscated binary analysis
0.212015
Symbolic Execution of Obfuscated Code · CCS 2015
Program analysis › symbolic execution
dynamic symbolic execution
0.212015
Symbolic Execution of Obfuscated Code · CCS 2015
Program analysis
symbolic execution
0.212015
Symbolic Execution of Obfuscated Code · CCS 2015
Program analysis › static analysis
abstract interpretation
0.232008
A semantics-based approach to malware detection · ACM Trans. Program. Lang. Syst. 2008
A semantics-based approach to malware detection · POPL 2007
Compositional Analysis of Modular Logic Programs · POPL 1993
Malware analysis › malware detection
semantics-based malware detection
0.222008
A semantics-based approach to malware detection · ACM Trans. Program. Lang. Syst. 2008
A semantics-based approach to malware detection · POPL 2007
Program analysis › static analysis
semantics-based program analysis
0.112011
Deobfuscation of virtualization-obfuscated software: a semantics-based approach · CCS 2011
Cryptographic primitives and cryptanalysis
obfuscation
0.112007
Binary Obfuscation Using Signals · USENIX Security Symposium 2007
Programming languages and type systems › language semantics
trace semantics
0.112007
A semantics-based approach to malware detection · POPL 2007
Program analysis
data flow analysis
0.162000
On the Complexity of Flow-Sensitive Dataflow Analyses · POPL 2000
On the Complexity of Dataflow Analysis of Logic Programs · ACM Trans. Program. Lang. Syst. 1995
Efficient Dataflow Analysis of Logic Programs · J. ACM 1992
Compilers and program optimization › program transformation
semantics-preserving transformation
0.112015
A Generic Approach to Automatic Deobfuscation of Executable Code · IEEE Symposium on Security and Privacy 2015
Compilers and program optimization
code size reduction
0.122002
Profile-Guided Code Compression · PLDI 2002
Compiler techniques for code compaction · ACM Trans. Program. Lang. Syst. 2000
Systems and software security
reverse engineering
0.122007
Obfuscation of executable code to improve resistance to static disassembly · CCS 2003
Binary Obfuscation Using Signals · USENIX Security Symposium 2007
Program analysis
static analysis
0.161997
Interprocedural Control Flow Analysis of First-Order Programs with Tail-Call Optimization · ACM Trans. Program. Lang. Syst. 1997
On the Complexity of Dataflow Analysis of Logic Programs · ACM Trans. Program. Lang. Syst. 1995
Cost Analysis of Logic Programs · ACM Trans. Program. Lang. Syst. 1993
Systems and software security
operating system security
0.112005
Protecting Against Unexpected System Calls · USENIX Security Symposium 2005
Systems and software security › operating system security
system call protection
0.112005
Protecting Against Unexpected System Calls · USENIX Security Symposium 2005
Compilers and program optimization › instruction scheduling
instruction-level parallelism
0.112005
Unpredication, Unscheduling, Unspeculation: Reverse Engineering Itanium Executables · IEEE Trans. Software Eng. 2005
Compilers and program optimization
predicated execution
0.112005
Unpredication, Unscheduling, Unspeculation: Reverse Engineering Itanium Executables · IEEE Trans. Software Eng. 2005
Software maintenance and evolution
reverse engineering
0.112005
Unpredication, Unscheduling, Unspeculation: Reverse Engineering Itanium Executables · IEEE Trans. Software Eng. 2005
Digital forensics and information hiding › watermarking
software watermarking
0.012004
Dynamic path-based software watermarking · PLDI 2004
Systems and software security › software protection
code obfuscation
0.012003
Obfuscation of executable code to improve resistance to static disassembly · CCS 2003
Compilers and program optimization
interprocedural optimization
0.022000
Compiler techniques for code compaction · ACM Trans. Program. Lang. Syst. 2000
Call Forwarding: A Simple Interprocedural Optimization Technique for Dynamically Typed Languages · POPL 1994

Methods — techniques the papers use, named apart from their topics

user study · 1.5adversarial perturbation · 1.5program representation · 0.9dependency analysis · 0.9program transformation · 0.4semantics-preserving simplification · 0.4bit-level taint analysis · 0.4architecture-aware constraint generation · 0.4abstract interpretation · 0.3static analysis · 0.3bytecode interpretation · 0.2reverse engineering · 0.2runtime metadata elimination · 0.1code specialization · 0.1model checking · 0.1binary rewriting · 0.0software decompression · 0.0profile-guided optimization · 0.0
YearPublicationVenuePosition
2025 Does Coding Style Really Survive Compilation? Stylometry of Executable Code Revisited
abstract
This paper describes a replication study of influential recent work on binary-level code stylometry by Caliskan et al. [8]. Using the Google Code Jam (GCJ) dataset that the original work used but with possible differences in authors and tasks, the accuracy results we obtain are significantly lower than those originally reported. An analysis of the features that contribute most to author classification decisions indicates that such features may, in many cases, be accidental artifacts---e.g., due to erroneous disassembly of data bytes embedded in the binary---and have little to do with programming style. Our results suggest that binary-level code stylometry. (1) is more sensitive to code characteristics than previously suspected; (2) can be significantly less accurate than previously reported (for 100 authors, we achieved approximately 63% accuracy, compared to the 96% reported in the original work); and (3) deserves careful attention to accidental artifacts arising from the compilation and stylometry toolchains. We found 29/33 of top ndisasm-based features resulted from erroneous disassembly. Our analysis revealed that this might cause the model to pick spurious features, i.e., the original file name, as the g++ compiler embeds the filename of the source CPP file into the binary -- which might unknowingly inflate the results.
Muaz Ali, Tugay Bilgis, Nimet Beyza Bozdag, Saumya K. Debray, Sazzadur Rahaman
Proc. Priv. Enhancing Technol.4
2024 Impeding LLM-assisted Cheating in Introductory Programming Assignments via Adversarial Perturbation
abstract
While Large language model (LLM)-based programming assistants such as CoPilot and Chat-GPT can help improve the productivity of professional software developers, they can also facilitate cheating in introductory computer programming courses.Assuming instructors have limited control over the industrial-strength models, this paper investigates the baseline performance of 5 widely used LLMs on a collection of introductory programming problems, examines adversarial perturbations to degrade their performance, and describes the results of a user study aimed at understanding the efficacy of such perturbations in hindering actual code generation for introductory programming assignments.The user study suggests that i) perturbations combinedly reduced the average correctness score by 77%, ii) the drop in correctness caused by these perturbations was affected based on their detectability.
Saiful Islam Salim, Rubin Yuchan Yang, Alexander Cooper, Suryashree Ray, Saumya K. Debray, Sazzadur Rahaman
EMNLP5
2023 Automatically Localizing Dynamic Code Generation Bugs in JIT Compiler Back-End
abstract
Just-in-Time (JIT) compilers are ubiquitous in modern computing systems and are used in a wide variety of software. Dynamic code generation bugs, where the JIT compiler silently emits incorrect code, can result in exploitable vulnerabilities. They, therefore, pose serious security concerns and make quick mitigation essential. However, due to the size and complexity of JIT compilers, quickly locating and fixing bugs is often challenging. In addition, the unique characteristics of JIT compilers make existing bug localization approaches inapplicable. Therefore, this paper proposes a new approach to automatic bug localization, explicitly targeting the JIT compiler back-end. The approach is based on explicitly modeling architecture-independent back-end representation and architecture-specific code-generation. Experiments using a prototype implementation on a widely used JIT compiler (Turbofan) indicate that it can successfully localize dynamic code generation bugs in the back-end with high accuracy.
HeuiChan Lim, Saumya K. Debray
CC2
2021 Automated bug localization in JIT compilers
abstract
Many widely-deployed modern programming systems use just-in-time (JIT) compilers to improve performance. The size and complexity of JIT-based systems, combined with the dynamic nature of JIT-compiler optimizations, make it challenging to locate and fix JIT compiler bugs quickly. At the same time, JIT compiler bugs can result in exploitable security vulnerabilities, making rapid bug localization important. Existing work on automated bug localization focuses on static code, i.e., code that is not generated at runtime, and so cannot handle bugs in JIT compilers that generate incorrect code during optimization. This paper describes an approach to automated bug localization in JIT compilers, down to the level of distinct optimization phases, starting with a single initial Proof-of-Concept (PoC) input that demonstrates the bug. Experiments using a prototype implementation of our ideas on Google’s V8 JavaScript interpreter and TurboFan JIT compiler demonstrates that it can successfully identify buggy optimization phases.
HeuiChan Lim, Saumya K. Debray
VEE2
2020 Representing and Reasoning about Dynamic Code
abstract
Dynamic code, i.e., code that is created or modified at runtime, is ubiquitous in today's world. The behavior of dynamic code can depend on the logic of the dynamic code generator in subtle and non-obvious ways, e.g., JIT compiler bugs can lead to exploitable vulnerabilities in the resulting JIT-compiled code. Existing approaches to program analysis do not provide adequate support for reasoning about such behavioral relationships. This paper takes a first step in addressing this problem by describing a program representation and a new notion of dependency that allows us to reason about dependency and information flow relationships between the dynamic code generator and the generated dynamic code. Experimental results show that analyses based on these concepts are able to capture properties of dynamic code that cannot be identified using traditional program analyses.
Jesse Bartels, Jon Stephens, Saumya K. Debray
ASE3
2018 Probabilistic Obfuscation Through Covert Channels
abstract
This paper presents a program obfuscation framework that uses covert channels through the program's execution environment to obfuscate information flow through the program. Unlike prior works on obfuscation, the use of covert channels removes visible information flows from the computation of the program and reroutes them through the program's runtime system and/or the operating system. This renders these information flows, and the corresponding control and data dependencies, invisible to program analysis tools such as symbolic execution engines. Additionally, we present the idea of probabilistic obfuscation which uses imperfect covert channels to leak information with some probabilistic guarantees. Experimental evaluation of our approach against state of the art detection and analysis techniques show the engines are not well-equipped to handle these obfuscations, particularly those of the probabilistic variety.
Jon Stephens, Babak Yadegari, Christian S. Collberg, Saumya K. Debray, Carlos Scheidegger
EuroS&P4
2017 Analysis of Exception-Based Control Transfers
abstract
Dynamic taint analysis and symbolic execution find many important applications in security-related program analyses. However, current techniques for such analyses do not take proper account of control transfers due to exceptions. As a result, they can fail to account for implicit flows arising from exception-based control transfers, leading to loss of precision and potential false negatives in analysis results. While the idea of using exceptions for obfuscating (unconditional) control transfers is well known, we are not aware of any prior work discussing the use of exceptions to implement conditional control transfers and implicit information flows. This paper demonstrates the problems that can arise in existing dynamic taint analysis and symbolic execution systems due to exception-based implicit information flows and proposes a generic architecture-agnostic solution for reasoning about the behavior of code using user-defined exception handlers. Experimental results from a prototype implementation indicate that the ideas described produce better results than current state-of-the-art systems.
Babak Yadegari, Jon Stephens, Saumya K. Debray
CODASPY3
2017 Control Dependencies in Interpretive Systems
Babak Yadegari, Saumya K. Debray
RV2
2015 Symbolic Execution of Obfuscated Code
abstract
Symbolic and concolic execution find important applications in a number of security-related program analyses, including analysis of malicious code. However, malicious code tend to very often be obfuscated, and current concolic analysis tech-niques have trouble dealing with some of these obfuscations, leading to imprecision and/or excessive resource usage. This paper discusses three such obfuscations: two of these are al-ready found in obfuscation tools used by malware, while the third is a simple variation on an existing obfuscation tech-nique. We show empirically that existing symbolic analyses are not robust against such obfuscations, and propose ways in which the problems can be mitigated using a combination of fine-grained bit-level taint analysis and architecture-aware constraint generations. Experimental results indicate that our approach is effective in allowing symbolic and concolic execution to handle such obfuscations.
Babak Yadegari, Saumya K. Debray
CCS2
2015 Identifying and Understanding Self-Checksumming Defenses in Software
abstract
Software self-checksumming is widely used as an anti-tampering mechanism for protecting intellectual property and deterring piracy. This makes it important to understand the strengths and weaknesses of various approaches to self-checksumming. This paper describes a dynamic information-flow-based attack that aims to identify and understand self-checksumming behavior in software. Our approach is applicable to a wide class of self chesumming defenses and the information obtained can be used to determine how the checksumming defenses may be bypassed. Experiments using a prototype implementation of our ideas indicate that our approach can successfully identify self-checksumming behavior in (our implementations of) proposals from the research literature.
Jing Qiu 0003, Babak Yadegari, Brian Johannesmeyer, Saumya K. Debray, Xiaohong Su
CODASPY4
2015 A Generic Approach to Automatic Deobfuscation of Executable Code
abstract
Malicious software are usually obfuscated to avoid detection and resist analysis. When new malware is encountered, such obfuscations have to be penetrated or removed ("deobfuscated") in order to understand the internal logic of the code and devise countermeasures. This paper discusses a generic approach for deobfuscation of obfuscated executable code. Our approach does not make any assumptions about the nature of the obfuscations used, but instead uses semantics-preserving program transformations to simplify away obfuscation code. We have applied a prototype implementation of our ideas to a variety of different kinds of obfuscation, including emulation-based obfuscation, emulation-based obfuscation with runtime code unpacking, and return-oriented programming. Our experimental results are encouraging and suggest that this approach can be effective in extracting the internal logic from code obfuscated using a variety of obfuscation techniques, including tools such as Themida that previous approaches could not handle.
Babak Yadegari, Brian Johannesmeyer, Ben Whitely, Saumya K. Debray
IEEE Symposium on Security and Privacy4
2015 Unveiling metamorphism by abstract interpretation of code properties
Mila Dalla Preda, Roberto Giacobazzi, Saumya K. Debray
Theor. Comput. Sci.3
2014 Bit-Level Taint Analysis
abstract
Taint analysis has a wide variety of applications in software analysis, making the precision of taint analysis an important consideration. Current taint analysis algorithms, including previous work on bit-precise taint analyses, suffer from shortcomings that can lead to significant loss of precision (under/over tainting) in some situations. This paper discusses these limitations of existing taint analysis algorithms, shows how they can lead to imprecise taint propagation, and proposes a generalization of current bit-level taint analysis techniques to address these problems and improve their precision. Experiments using a deobfuscation tool indicate that our enhanced taint analysis algorithm leads to significant improvements in the quality of deobfuscation.
Babak Yadegari, Saumya K. Debray
SCAM2
2013 Weaknesses in Defenses against Web-Borne Malware - (Short Paper)
Gen Lu, Saumya K. Debray
DIMVA2
2012 Micro-specialization: dynamic code specialization of database management systems
abstract
Database management systems (DBMSes) form a cornerstone of modern IT infrastructure, and it is essential that they have excellent performance. Much of the work to date on optimizing DBMS performance has emphasized ensuring efficient data access from secondary storage. This paper shows that DBMSes can also benefit significantly from dynamic code specialization. Our approach focuses on the iterative query evaluation loops typically used by such systems. Query evaluation involves extensive references to the relational schema, predicate values, and join types, which are all invariant during query evaluation, and thus are subject to dynamic value-based code specialization.
Rui Zhang 0035, Saumya K. Debray, Richard T. Snodgrass
CGO2
2012 Micro-Specialization in DBMSes
abstract
Relational database management systems are general in the sense that they can handle arbitrary schemas, queries, and modifications, this generality is implemented using runtime metadata lookups and tests that ensure that control is channelled to the appropriate code in all cases. Unfortunately, these lookups and tests are carried out even when information is available that renders some of these operations superfluous, leading to unnecessary runtime overheads. This paper introduces micro-specialization, an approach that uses relation- and query-specific information to specialize the DBMS code at runtime and thereby eliminate some of these overheads. We develop a taxonomy of approaches and specialization times and propose a general architecture that isolates most of the creation and execution of the specialized code sequences in a separate DBMS-independent module. Through three illustrative types of micro-specializations applied to PostgreSQL, we show that this approach requires minimal changes to a DBMS and can improve the performance simultaneously across a wide range of queries, modifications, and bulk-loading, in terms of storage, CPU usage, and I/O time of the TPC-H and TPC-C benchmarks.
Rui Zhang 0035, Richard T. Snodgrass, Saumya K. Debray
ICDE3
2011 Deobfuscation of virtualization-obfuscated software: a semantics-based approach
abstract
When new malware are discovered, it is important for researchers to analyze and understand them as quickly as possible. This task has been made more difficult in recent years as researchers have seen an increasing use of virtualization-obfuscated malware code. These programs are difficult to comprehend and reverse engineer, since they are resistant to both static and dynamic analysis techniques. Current approaches to dealing with such code first reverse-engineer the byte code interpreter, then use this to work out the logic of the byte code program. This outside-in approach produces good results when the structure of the interpreter is known, but cannot be applied to all cases. This paper proposes a different approach to the problem that focuses on identifying instructions that affect the observable behavior of the obfuscated code. This inside-out approach requires fewer assumptions, and aims to complement existing techniques by broadening the domain of obfuscated programs eligible for automated analysis. Results from a prototype tool on real-world malicious code are encouraging.
Kevin Coogan, Gen Lu, Saumya K. Debray
CCS3
2011 Equational Reasoning on x86 Assembly Code
abstract
Analysis of software is essential to addressing problems of correctness, efficiency, and security. Existing source code analysis tools are very useful for such purposes, but there are many instances where high-level source code is not available for software that needs to be analyzed. A need exists for tools that can analyze assembly code, whether from disassembled binaries or from handwritten sources. This paper describes an equational reasoning system for assembly code for the ubiquitous Intel x86 architecture, focusing on various problems that arise in low-level equational reasoning, such as register-name aliasing, memory indirection, condition-code flags, etc. Our system has successfully been applied to the problem of simplifying execution traces from obfuscated malware executables.
Kevin Coogan, Saumya K. Debray
SCAM2
2010 Modelling Metamorphism by Abstract Interpretation
Mila Dalla Preda, Roberto Giacobazzi, Saumya K. Debray, Kevin Coogan, Gregg M. Townsend
SAS3
2008 A semantics-based approach to malware detection
abstract
Malware detection is a crucial aspect of software security. Current malware detectors work by checking for signatures , which attempt to capture the syntactic characteristics of the machine-level byte sequence of the malware. This reliance on a syntactic approach makes current detectors vulnerable to code obfuscations, increasingly used by malware writers, that alter the syntactic properties of the malware byte sequence without significantly affecting their execution behavior. This paper takes the position that the key to malware identification lies in their semantics. It proposes a semantics-based framework for reasoning about malware detectors and proving properties such as soundness and completeness of these detectors. Our approach uses a trace semantics to characterize the behavior of malware as well as that of the program being checked for infection, and uses abstract interpretation to “hide” irrelevant aspects of these behaviors. As a concrete application of our approach, we show that (1) standard signature matching detection schemes are generally sound but not complete, (2) the semantics-aware malware detector proposed by Christodorescu et al. is complete with respect to a number of common obfuscations used by malware writers and (3) the malware detection scheme proposed by Kinder et al. and based on standard model-checking techniques is sound in general and complete on some, but not all, obfuscations handled by the semantics-aware malware detector.
Mila Dalla Preda, Mihai Christodorescu, Somesh Jha, Saumya K. Debray
ACM Trans. Program. Lang. Syst.4
2007 Code Compaction of an Operating System Kernel
abstract
General-purpose operating systems, such as Linux, are increasingly being used in embedded systems. Computational resources are usually limited, and embedded processors often have a limited amount of memory. This makes code size especially important. This paper describes techniques for automatically reducing the memory footprint of general-purpose operating systems on embedded platforms. The problem is complicated by the fact that kernel code tends to be quite different from ordinary application code, including the presence of a significant amount of hand-written assembly code, multiple entry points, implicit control flow paths involving interrupt handlers, and frequent indirect control flow via function pointers. We use a novel "approximate decompilation" technique to apply source-level program analysis to hand-written assembly code. A prototype implementation of our ideas on an Intel x86 platform, applied to a Linux kernel that has been configured to exclude unnecessary code, obtains a code size reduction of close to 24%
Haifeng He, John Trimble, Somasundaram Perianayagam, Saumya K. Debray, Gregory R. Andrews
CGO4
2007 The revenge of the overlay: automatic compaction of OS kernel code via on-demand code loading
abstract
There is increasing interest in using general-purpose operating systems, such as Linux, on embedded platforms. It is especially important in embedded systems to use memory efficiently because embedded processors often have limited physical memory. This paper describes an automatic technique for reducing the memory footprint of general-purpose operating systems on embedded platforms by keeping infrequently executed code on secondary storage and loading such code only if it is needed at run time. Our technique is based on an old idea - memory overlays - and it does not require hardware or operating system support for virtual memory. A prototype of the technique has been implemented for the Linux kernel. We evaluate our approach with two benchmark suites: MiBench and MediaBench, and a Web server application. The experimental results show that our approach reduces memory requirements for the Linux kernel code by about 53% with little degradation in performance.
Haifeng He, Saumya K. Debray, Gregory R. Andrews
EMSOFT2
2007 A semantics-based approach to malware detection
abstract
Malware detection is a crucial aspect of software security. Current malware detectors work by checking for "signatures," which attempt to capture (syntactic) characteristics of the machine-level byte sequence of the malware. This reliance on a syntactic approach makes such detectors vulnerable to code obfuscations, increasingly used by malware writers, that alter syntactic properties of the malware byte sequence without significantly affecting their execution behavior.This paper takes the position that the key to malware identification lies in their semantics. It proposes a semantics-based framework for reasoning about malware detectors and proving properties such as soundness and completeness of these detectors. Our approach uses a trace semantics to characterize the behaviors of malware as well as the program being checked for infection, and uses abstract interpretation to "hide" irrelevant aspects of these behaviors. As a concrete application of our approach, we show that the semantics-aware malware detector proposed by Christodorescu et al. is complete with respect to a number of common obfuscations used by malware writers.
Mila Dalla Preda, Mihai Christodorescu, Somesh Jha, Saumya K. Debray
POPL4
2007 Binary Obfuscation Using Signals
Igor V. Popov, Saumya K. Debray, Gregory R. Andrews
USENIX Security Symposium2
2005 Code Compression
Saumya K. Debray
PADL1
2005 Protecting Against Unexpected System Calls
Cullen Linn, Mohan Rajagopalan, Scott Baker, Christian S. Collberg, Saumya K. Debray, John H. Hartman
USENIX Security Symposium5
2005 Unpredication, Unscheduling, Unspeculation: Reverse Engineering Itanium Executables
abstract
EPIC (explicitly parallel instruction computing) architectures, exemplified by the Intel Itanium, support a number of advanced architectural features, such as explicit instruction-level parallelism, instruction predication, and speculative loads from memory. However, compiler optimizations that take advantage of these features can profoundly restructure the program's code, making it potentially difficult to reconstruct the original program logic from an optimized Itanium executable. This paper describes techniques to undo some of the effects of such optimizations and thereby improve the quality of reverse engineering such executables.
Noah Snavely, Saumya K. Debray, Gregory R. Andrews
IEEE Trans. Software Eng.2
2004 Dynamic path-based software watermarking
abstract
Software watermarking is a tool used to combat software piracy by embedding identifying information into a program. Most existing proposals for software watermarking have the shortcoming that the mark can be destroyed via fairly straightforward semantics-preserving code transformations. This paper introduces path-based watermarking, a new approach to software watermarking based on the dynamic branching behavior of programs. The advantage of this technique is that error-correcting and tamper-proofing techniques can be used to make path-based watermarks resilient against a wide variety of attacks. Experimental results, using both Java bytecode and IA-32 native code, indicate that even relatively large watermarks can be embedded into programs at modest cost.
Christian S. Collberg, Edward Carter, Saumya K. Debray, Andrew Huntwork, John D. Kececioglu, Cullen Linn, Michael Stepp
PLDI3
2004 Writing efficient programs: performance issues in an undergraduate CS curriculum
abstract
Performance is an essential aspect of many software systems, and it is important for programmers to understand performance issues. However, most undergraduate curricula do not explicitly cover performance issues---performance monitoring and profiling tools, performance improvement techniques, and case studies---in their curricula. This paper describes how we address this topic as part of a third-year programming course. We focus on tools and techniques for monitoring and improving performance, as well as the interaction between clean program design and performance tuning.
Saumya K. Debray
SIGCSE1
2003 Obfuscation of executable code to improve resistance to static disassembly
abstract
A great deal of software is distributed in the form of executable code. The ability to reverse engineer such executables can create opportunities for theft of intellectual property via software piracy, as well as security breaches by allowing attackers to discover vulnerabilities in an application. The process of reverse engineering an executable program typically begins with disassembly, which translates machine code to assembly code. This is then followed by various decompilation steps that aim to recover higher-level abstractions from the assembly code. Most of the work to date on code obfuscation has focused on disrupting or confusing the decompilation phase. This paper, by contrast, focuses on the initial disassembly phase. Our goal is to disrupt the static disassembly process so as to make programs harder to disassemble correctly. We describe two widely used static disassembly algorithms, and discuss techniques to thwart each of them. Experimental results indicate that significant portions of executables that have been obfuscated using our techniques are disassembled incorrectly, thereby showing the efficacy of our methods.
Cullen Linn, Saumya K. Debray
CCS2
2003 Cassyopia: Compiler Assisted System Optimization
Mohan Rajagopalan, Saumya K. Debray, Matti A. Hiltunen, Richard D. Schlichting
HotOS2
2003 Unspeculation
abstract
Modern architectures, such as the Intel Itanium, support speculation, a hardware mechanism that allows the early execution of expensive operations possibly even before it is known whether the results of the operation are needed. While such speculative execution can improve execution performance considerably, it requires a significant amount of complex support code to deal with and recover from speculation failures. This greatly complicates the tasks of understanding and re-engineering speculative code. This paper describes a technique for removing speculative instructions from optimized binary programs in a way that is guaranteed to preserve program semantics, thereby making the resulting "unspeculated" programs easier to understand and more amenable to reengineering using traditional reverse engineering techniques.
Noah Snavely, Saumya K. Debray, Gregory R. Andrews
ASE2
2003 Load redundancy elimination on executable code
abstract
Abstract Optimizations performed at link time or directly applied to final program executables have received increased attention in recent years. This paper discusses the discovery and elimination of redundant load operations in the context of a link‐time optimizer, an optimization that we callLoad Redundancy Elimination (LRE). Our experiments show that between 50% and 75% of a program's memory references can be considered redundant because they are accessing memory locations that have been referenced less than 200–400 instructions away. We then present three profile‐based LRE algorithms targeted at optimizing away these redundancies. Our results show that between 5% and 30% of the redundancy detected can indeed be eliminated, which translates into program speedups of around 8%. We also test our algorithm assuming different cache latencies, and show that, if latencies continue to grow, the load redundancy elimination will become more important. Copyright © 2003 John Wiley & Sons, Ltd.
Manel Fernández, Roger Espasa, Saumya K. Debray
Concurr. Comput. Pract. Exp.3
2002 Profile-Guided Code Compression
abstract
As computers are increasingly used in contexts where the amount of available memory is limited, it becomes important to devise techniques that reduce the memory footprint of application programs while leaving them in an executable form. This paper describes an approach to applying data compression techniques to reduce the size of infrequently executed portions of a program. The compressed code is decompressed dynamically (via software) if needed, prior to execution. The use of data compression techniques increases the amount of code size reduction that can be achieved; their application to infrequently executed code limits the runtime overhead due to dynamic decompression; and the use of software decompression renders the approach generally applicable, without requiring specialized hardware. The code size reductions obtained depend on the threshold used to determine what code is "infrequently executed" and hence should be compressed: for low thresholds, we see size reductions of 13.7% to 18.8%, on average, for a set of embedded applications, without excessive runtime overhead.
Saumya K. Debray, William S. Evans
PLDI1
2002 Profile-Directed Optimization of Event-Based Programs
abstract
Events are used as a fundamental abstraction in programs ranging from graphical user interfaces (GUIs) to systems for building customized network protocols. While providing a flexible structuring and execution paradigm, events have the potentially serious drawback of extra execution overhead due to the indirection between modules that raise events and those that handle them. This paper describes an approach to addressing this issue using static optimization techniques. This approach, which exploits the underlying predictability often exhibited by event-based programs, is based on first profiling the program to identify commonly occurring event sequences. A variety of techniques that use the resulting profile information are then applied to the program to reduce the overheads associated with such mechanisms as indirect function calls and argument marshaling. In addition to describing the overall approach, experimental results are given that demonstrate the effectiveness of the techniques. These results are from event-based programs written for X Windows, a system for building GUIs, and Cactus, a system for constructing highly configurable distributed services and network protocols.
Mohan Rajagopalan, Saumya K. Debray, Matti A. Hiltunen, Richard D. Schlichting
PLDI2
2002 Making compiler design relevant for students who will (most likely) never design a compiler
abstract
Compiler Design courses are a common component of most modern Computer Science undergraduate curricula. At the same time, however, compiler design has become a highly specialized topic, and it is not clear that a significant number of Computer Science students will find themselves designing compilers professionally. This paper argues that the principles, techniques, and tools discussed in compiler design courses are nevertheless applicable to a wide variety of situations that would generally not be considered to be com-piler design. Generalizing the content of compiler design courses to emphasize this broad applicability can make themmore relevant to students.
Saumya K. Debray
SIGCSE1
2001 Goal-Directed Value Profiling
Scott A. Watterson, Saumya K. Debray
CC2
2001 Load Redundancy Elimination on Executable Code
Manel Fernández, Roger Espasa, Saumya K. Debray
Euro-Par3
2001 alto: a link-time optimizer for the Compaq Alpha
abstract
Traditional optimizing compilers are limited in the scope of their optimizations by the fact that only a single function, or possibly a single module, is available for analysis and optimization. In particular, this means that library routines cannot be optimized to specific calling contexts. Other optimization opportunities, exploiting information not available before link time, such as addresses of variables and the final code layout, are often ignored because linkers are traditionally unsophisticated. A possible solution is to carry out whole-program optimization at link time. This paper describes alto, a link-time optimizer for the Compaq Alpha architecture. It is able to realize significant performance improvements even for programs compiled with a good optimizing compiler with a high level of optimization. The resulting code is considerably faster than that obtained using the OM link-time optimizer, even when the latter is used in conjunction with profile-guided and inter-file compile-time optimizations. Copyright © 2001 John Wiley & Sons, Ltd.
Robert Muth, Saumya K. Debray, Scott A. Watterson, Koen De Bosschere
Softw. Pract. Exp.2
2000 On the Complexity of Flow-Sensitive Dataflow Analyses
abstract
This paper attempts to address the question of why certain dataflow analysis problems can be solved efficiently, but not others. We focus on flow-sensitive analyses, and give a simple and general result that shows that analyses that require the use of relational attributes for precision must be PSPACE-hard in general. We then show that if the language constructs are slightly strengthened to allow a computation to maintain a very limited summary of what happens along an execution path, inter-procedural analyses become EXPTIME-hard. We discuss applications of our results to a variety of analyses discussed in the literature. Our work elucidates the reasons behind the complexity results given by a number of authors, improves on a number of such complexity results, and exposes conceptual commonalities underlying such results that are not readily apparent otherwise.
Robert Muth, Saumya K. Debray
POPL2
2000 Code Specialization Based on Value Profiles
Robert Muth, Scott A. Watterson, Saumya K. Debray
SAS3
2000 Compiler techniques for code compaction
abstract
In recent years there has been an increasing trend toward the incorpor ation of computers into a variety of devices where the amount of memory available is limited. This makes it desirable to try to reduce the size of applications where possible. This article explores the use of compiler techniques to accomplish code compaction to yield smaller executables. The main contribution of this article is to show that careful, aggressive, interprocedural optimization, together with procedural abstraction of repeated code fragments, can yield significantly better reductions in code size than previous approaches, which have generally focused on abstraction of repeated instruction sequences. We also show how “equivalent” code fragments can be detected and factored out using conventional compiler techniques, and without having to resort to purely linear treatments of code sequences as in suffix-tree-based approaches, thereby setting up a framework for code compaction that can be more flexible in its treatment of what code fragments are considered equivalent. Our ideas have been implemented in the form of a binary-rewriting tool that reduces the size of executables by about 30% on the average.
Saumya K. Debray, William S. Evans, Robert Muth, Bjorn De Sutter
ACM Trans. Program. Lang. Syst.1
1999 Link-Time Improvement of Scheme Programs
Saumya K. Debray, Robert Muth, Scott A. Watterson
CC1
1998 Alias Analysis of Executable Code
abstract
Recent years have seen increasing interest in systems that reason about and manipulate executable code. Such systems can generally benefit from information about aliasing. Unfortunately, most existing alias analyses are formulated in terms of high-level language features, and are unable to cope with features, such as pointer arithmetic, that pervade executable programs. This paper describes a simple algorithm that can be used to obtain aliasing information for executabie code. In order to be practical, the algorithm is carefut to keep its memory requirements low, sacrificing precision where necessary to achieve this goal. Experimental results indicate that it is nevertheless able to provide a reasonable amount of information about memory references across a variety of benchmark programs.
Saumya K. Debray, Robert Muth, Matthew Weippert
POPL1
1997 Non-Failure Analysis for Logic Programs
Saumya K. Debray, Pedro López-García 0001, Manuel V. Hermenegildo
ICLP1
1997 A Practical Approach to Structure Reuse of Arrays in Single Assignment Languages
Andreas Kågedal, Saumya K. Debray
ICLP2
1997 Resource-Bounded Partial Evaluation
abstract
Most partial evaluators do not take the availability of machine-level resources, such as registers or cache, into consideration when making their specialization decisions. The resulting resource contention can lead to severe performance degradation---causing, in extreme cases, the specialized code to run slower than the unspecialized code. In this paper we consider how resource considerations can be incorporated within a partial evaluator. We develop an abstract formulation of the problem, show that optimal resource-bounded partial evaluation is NP-complete, and discuss simple heuristics that can be used to address the problem in practice. 1 Introduction The field of partial evaluation has matured greatly in recent years, and partial evaluators have been implemented for a wide variety of programming languages [1, 4, 5, 6, 20, 29]. A central concern guiding these implementations has been to ensure that input programs should be specialized as far as possible without compromising ...
Saumya K. Debray
PEPM1
1997 Interprocedural Control Flow Analysis of First-Order Programs with Tail-Call Optimization
abstract
Knowledge of low-level control flow is essential for many compiler optimizations. In systems with tail-call optimization, the determination of interprocedural control flow is complicated by the fact that because of tail-call optimization, control flow at procedure returns is not readily evident from the call graph of the program. This article shows how interprocedural control-flow analysis of first-order programs can be carried out using well-known concepts from parsing theory. In particular, we show that context-insensitive ( or zeroth-order) control-flow analysis corresponds to the notion of FOLLOW sets in context-free grammars, while context-sensitive (or first-order) control-flow analysis corresponds to the notion of LR(1) items. The control-flow information so obtained can be used to improve the precision of interprocedural dataflow analyses as well as to extend certain low-level code optimizations across procedure boundaries.
Saumya K. Debray, Todd A. Proebsting
ACM Trans. Program. Lang. Syst.1
1996 A Methodology for Granularity-Based Control of Parallelism in Logic Programs
Pedro López-García 0001, Manuel V. Hermenegildo, Saumya K. Debray
J. Symb. Comput.3
1995 Abstract Interpretation and Low-Level Code Optimization
abstract
interpretation is widely accepted as a natural framework for semantics-based analysis of program properties.However, most formulations of abstract interpretation are in terms of high-level semantic entities that do not adequately address the needs of lowlevel optimizations.In this paper we discuss the role of abstract interpretation in low-level compiler optimization, examine some of its limitations, and consider ways in which they might be addressed.1
Saumya K. Debray
PEPM1
1995 On the Complexity of Dataflow Analysis of Logic Programs
abstract
It is widely held that there is a correlation between complexity and precision in dataflow analysis, in the sense that the more precise an analysis algorithm, the more computationally expensive it must be. The details of this relationship, however, appear to not have been explored extensively. This article reports some results on this correlation in the context of logic programs. A formal notion of the “precision” of an analysis algorithm is proposed, and this is used to characterize the worst-case computational complexity of a number of dataflow analyses with different degrees of precision. While this article considers the analysis of logic programs, the technique proposed, namely the use of “exactness sets” to study relationships between complexity and precision of analyses, is not specific to logic programming in any way, and is equally applicable to flow analyses of other language families.
Saumya K. Debray
ACM Trans. Program. Lang. Syst.1
1994 Output Value Placement in Moded Logic Programs
Peter A. Bigot, David Gudeman, Saumya K. Debray
ICLP3
1994 Call Forwarding: A Simple Interprocedural Optimization Technique for Dynamically Typed Languages
abstract
This paper discusses call forwarding, a simple interprocedural optimization technique for dynamically typed languages. The basic idea behind the optimization is straightforward: find an ordering for the “entry actions” of a procedure, and generate multiple entry points for the procedure, so as to maximize the savings realized from different call sites bypassing different sets of entry actions. We show that the problem of computing optimal solutions to arbitrary call forwarding problems is NP-complete, and describe an efficient greedy algorithm for the problem. Experimental results indicate that (i) this algorithm is effective, in that the solutions produced are generally close to optimal; and (ii) the resulting optimization leads to significant performance improvements for a number of benchmarks tested.
Koen De Bosschere, Saumya K. Debray, David Gudeman, Sampath Kannan
POPL2
1994 Estimating the Computational Cost of Logic Programs
Saumya K. Debray, Pedro López-García 0001, Manuel V. Hermenegildo, Nai-Wei Lin
SAS1
1993 On Copy Avoidance in Single Assignment Languages
Saumya K. Debray
ICLP1
1993 Compositional Analysis of Modular Logic Programs
abstract
This paper describes a semantic basis for a compositional approach to the analysis of logic programs. A logic program is viewed as consisting of a set of modules, each module defining a subset of the program's predicates. Analyses are constructed by considering abstract interpretations of a compositional semantics. The abstract meaning of a module corresponds to its analysis and composition of abstract meanings corresponds to composition of analyses. Such an approach is essential for large program development so that altering one module does not require re-analysis of the entire program. We claim that for a substantial class of programs, compositional analyses which are based on a notion of abstract unfolding provide the same precision as non-compositional analysis. A compositional analysis for ground dependencies is included to illustrate the approach. To the best of our knowledge this is the first account of a compositional framework for the analysis of logic programs.
Michael Codish, Saumya K. Debray, Roberto Giacobazzi
POPL2
1993 QD-Janus: a Sequential Implementation of Janus in Prolog
abstract
Abstract Janus is a language designed for distributed constraint programming. This paper describes QD‐Janus, a sequential implementation of Janus in Prolog. The compiler uses a number of novel analyses and optimizations to improve the performance of the system. The choice of Prolog as the target language for a compiler, although unusual, is motivated by the following: (i) the semantic gap between Janus and Prolog is much smaller than that between Janus and, say, C or machine language—this simplifies the compilation process significantly, and makes it possible to develop a system with reasonable performance fairly quickly; (ii) recent progress in Prolog implementation techniques, and the development of Prolog systems whose speeds are comparable to those of imperative languages, indicates that the translation to Prolog need not entail a significant performance loss compared to native code compilers; and (iii) compilation to Prolog can benefit immediately from a significant body of work on, and implementations of, parallel Prolog systems. Our experience indicates that translation of logic programming languages to Prolog, accompanied by the development of good program analysis and optimization tools, is an effective way to quickly develop flexible and portable implementations with good performance and low cost.
Saumya K. Debray
Softw. Pract. Exp.1
1993 Reasoning About Naming Systems
abstract
This paper defines a simple model, called a preference hierarchy, that provides a framework for using the information available to a naming system to compute the object(s) identified by a given name. The preference hierarchy therefore serves as a formal tool for designing and reasoning about naming systems.
Mic Bowman, Saumya K. Debray, Larry L. Peterson
ACM Trans. Program. Lang. Syst.2
1993 Cost Analysis of Logic Programs
abstract
Cost analysis of programs has been studied in the context of imperative and functional programming languages. For logic programs, the problem is complicated by the fact that programs may be nondeterministic and produce multiple solutions. A related problem is that because failure of execution is not an abnormal situation, it is possible to write programs where implicit failures have to be dealt with explicitly in order to get meaningful results. This paper addresses these problems and develops a method for (semi-)automatic analysis of the worst-case cost of a large class of logic programs. The primary contribution of this paper is the development of techniques to deal with nondeterminism and the generation of multiple solutions via backtracking. Applications include program transformation and synthesis, software engineering, and in parallelizing compilers. Categories and Subject Descriptors: D.1 [Software]: Programming Techniques; D.1.6 [Program- ming Techniques]: Logic Progra...
Saumya K. Debray, Nai-Wei Lin
ACM Trans. Program. Lang. Syst.1
1992 On the Complexity of Dataflow Analysis of Logic Programs
Saumya K. Debray
ICALP1
1992 Efficient Dataflow Analysis of Logic Programs
abstract
A framework for efficient dataflow analyses of logic programs is investigated. A number of problems arise in this context: aliasing effects can make analysis computationally expensive for sequential logic programming languages; synchronization issues can complicate the analysis of parallel logic programming languages; and finiteness restrictions to guarantee termination can limit the expressive power of such analyses. Our main result is to give a simple characterization of a family of flow analyses where these issues can be ignored without compromising soundness. This results in algorithms that are simple to verify and implement, and efficient in execution. Based on this approach, we describe an efficient algorithm for flow analysis of sequential logic programs, extend this approach to handle parallel executions, and finally describe how infinite chains in the analysis domain can be accommodated without compromising termination.
Saumya K. Debray
J. ACM1
1991 Automatic Complexity Analysis of Logic Programs
Saumya K. Debray, Nai-Wei Lin
ICLP1
1990 Static Estimation of Query Sizes in Horn Programs
Saumya K. Debray, Nai-Wei Lin
ICDT1
1990 Task Granularity Analysis in Logic Programs
abstract
While logic programming languages offer a great deal of scope for parallelism, there is usually some overhead associated with the execution of goals in parallel because of the work involved in task creation and scheduling. In practice, therefore, the “granularity” of a goal, i.e. an estimate of the work available under it, should be taken into account when deciding whether or not to execute a goal concurrently as a separate task. This paper describes a method for estimating the granularity of a goal at compile time. The runtime overhead associated with our approach is usually quite small, and the performance improvements resulting from the incorporation of grainsize control can be quite good. This is shown by means of experimental results.
Saumya K. Debray, Nai-Wei Lin, Manuel V. Hermenegildo
PLDI1
1990 Towards Banishing the Cut from Prolog
abstract
Logic programs can often be inefficient. The usual solution to this problem has been to return some control to the user in the form of impure language features like cut. The authors argue that it is not necessary to resort to such impure features for efficiency. This point is illustrated by considering how most of the common uses of cut can be eliminated from Prolog source programs, relying on static analysis to generate them at compile time. Three common situations where the cut is used are considered. Static analysis techniques are given to detect such situations, and applicable program transformations are described. Two language constructs, firstof and oneof, for situations involving don't-care nondeterminism, are suggested. These constructs have better declarative readings than the cut and extend better to parallel evaluation strategies. Together, these proposals result in a system where users need rely much less on cuts for efficiency, thereby promoting a purer programming style without sacrificing efficiency.>
Saumya K. Debray, David Scott Warren
IEEE Trans. Software Eng.1
1989 A Simple Code Improvement Scheme for Prolog
Saumya K. Debray
ICLP1
1989 Static Inference of Modes and Data Dependencies in Logic Programs
abstract
Mode and data dependency analyses find many applications in the generation of efficient executable code for logic programs. For example, mode information can be used to generate specialized unification instructions where permissible, to detect determinacy and functionality of programs, generate index structures more intelligently, reduce the amount of runtime tests in systems that support goal suspension, and in the integration of logic and functional languages. Data dependency information can be used for various source-level optimizing transformations, to improve backtracking behavior and to parallelize logic programs. This paper describes and proves correct an algorithm for the static inference of modes and data dependencies in a program. The algorithm is shown to be quite efficient for programs commonly encountered in practice.
Saumya K. Debray
ACM Trans. Program. Lang. Syst.1
1989 Functional Computations in Logic Programs
abstract
Although the ability to simulate nondeterminism and to compute multiple solutions for a single query is a powerful and attractive feature of logic programming languages, it is expensive in both time and space. Since programs in such languages are very often functional, that is, they do not produce more than one distinct solution for a single input, this overhead is especially undesirable. This paper describes how programs may be analyzed statically to determine which literals and predicates are functional, and how the program may then be optimized using this information. Our notion of “functionality” subsumes the notion of “determinacy” that has been considered by various researchers. Our algorithm is less reliant on language features such as the cut, and thus extends more easily to parallel execution strategies, than others that have been proposed.
Saumya K. Debray, David Scott Warren
ACM Trans. Program. Lang. Syst.1
1988 Unfold/Fold Transformations and Loop Optimization of Logic Programs
abstract
Programs typically spend much of their execution time in loops. This makes the generation of efficient code for loops essential for good performance. Loop optimization of logic programming languages is complicated by the fact that such languages lack the iterative constructs of traditional languages, and instead use recursion to express loops. In this paper, we examine the application of unfold/fold transformations to three kinds of loop optimization for logic programming languages: recursion removal, loop fusion and code motion out of loops. We describe simple unfold/fold transformation sequences for these optimizations that can be automated relatively easily. In the process, we show that the properties of unification and logical variables can sometimes be used to generalize, from traditional languages, the conditions under which these optimizations may be carried out. Our experience suggests that such source-level transformations may be used as an effective tool for the optimization of logic programs.
Saumya K. Debray
PLDI1
1988 Efficient Dataflow Analysis of Logic Programs
abstract
We investigate a framework for efficient flow analyses of logic programs. A major problem in this context is that unification can give rise to aliasing and dependencies between variables whose effects are difficult to predict, and which make sound flow analysis algorithms computationally expensive. We give a simple characterization of the class of flow analysis problems for which aliasing effects can be ignored without loss of soundness, and describe an efficient analysis procedure for this class of problems. The utility of our approach is illustrated by discussing its application to several analysis and optimization problems for logic programs. Our results are useful in the design of efficient flow analysis systems for logic programming languages.
Saumya K. Debray
POPL1
1988 Profiling Prolog Programs
abstract
Abstract Profilers play an important role in the development of efficient programs. Profiling techniques developed for traditional languages are inadequate for logic programming languages, for a number of reasons: first, the flow of control in logic programming languages, involving back‐tracking and failure, is significantly more complex than in traditional languages; secondly, the time taken by a unification operation, the principal primitive operation of such languages, cannot be predicted statically because it depends on the size of the input; and finally, programs may change at run‐time because clauses may be added or deleted using primitives such as assert and retract. This paper describes a simple profiler for Prolog. The ideas outlined here may be used either to implement a simple interactive profiler, or integrated into Prolog compilers.
Saumya K. Debray
Softw. Pract. Exp.1
1986 Detection and Optimization of Functional Computations in Prolog
David Scott Warren, Saumya K. Debray
ICLP2
1984 On the Existence and Construction of Robust Communication Protocals for Unreliable Channels
Saumya K. Debray, Ariel J. Frank, Scott A. Smolka
FSTTCS1