1 research outputs found

    Call path sensitive interprocedural alias analysis of C programs

    Get PDF
    This work presents a new approach to detect may-aliases within ANSI-C programs. A may-alias occurs if two variables (or more complex expressions) use the same memory location. Aliases may be created by call-by-reference function calls or by pointer usage. In the context of C programs alias analysis becomes very complex because of the extensive pointer usage and the very few restrictions concerning pointer manipulations. <br /> Within this work it is described how the effects of a program can be summarised by so-called function interface graphs which are a static representation of the memory locations and the values stored at these locations. Based on standard techniques (function call and return statement normalisation, control flow graphs, static single assignment form), the intraprocedural step creates a function interface graph for each function individually by computing and merging the information for all its basic blocks according to the CFG structure. Afterwards these graphs will be reduced to their externally visible effects. This reduces the size of these graphs and will hence allow the following computations to be carried out more efficiently. Within the next step the reduced graphs will be merged according to the corresponding functions and their calls (interprocedural analysis). This is done by ignoring indirect function calls (through function pointers) first, and processing these calls only if a function that could be called by one of these calls is detected. In case functions are called by more than a single function call, the calling context will be taken into account as far as possible. <br /> A major benefit of our algorithm is that it can be applied to real ANSI-C programs since it makes only a few restrictions, i.e. effects of assembler code, interrupts, volatile attributes and I/O-based aliases. It deals with structures and unions, arbitrary pointer usage, type casts and function pointers. Under these circumstances, the algorithm cannot benefit from type information and, hence, the function interface graphs are based on a low-level memory representation. The algorithm was implemented using the SUIF compiler, and it has been successfully applied to a set of non-toy C programs.Das Thema dieser Arbeit ist ein neuer Ansatz zur Bestimmung von may-alias-Beziehungen im Rahmen von ANSI-C-Programmen. Von einem may-alias spricht man, wenn zwei verschiedene Variablen (oder auch komplexere Ausdr&uuml;cke) ein und dieselbe Speicherstelle verwenden. Aliase entstehen durch die Verwendung von call-by-reference-Parametern oder Zeigern. Im Rahmen von C-Programmen entstehen hier besonders schwerwiegende Probleme, da C-Programme in der Regel intensiven Gebrauch von Zeigern machen und dar&uuml;ber hinaus nur sehr wenige Restriktionen f&uuml;r den Einsatz von Zeigern existieren. <br /> Im Rahmen dieser Arbeit wird ein Verfahren beschrieben, da&szlig; die Zusammenfassung der f&uuml;r die Alias-Analyse relevanten Effekte mit Hilfe von Graphen (function interface graphs) realisiert. Diese Graphen stellen eine statische Repr&auml;sentation der von einem Programm benutzten Speicherstellen, sowie der darin enthaltenen Werte dar. Basierend auf einer Reihe von Standard-Verfahren (Normalisierung der Aufrufe und R&uuml;ckgabewerte einer Funktion, Kontrollflu&szlig;graphen, Static-Single-Assignment-Form) wird w&auml;hrend der intraprozeduralen Phase zun&auml;chst f&uuml;r jede Funktion ein Graph gebildet, der ihre Effekte zusammenfa&szlig;t. Hierzu werden einzelne Graphen f&uuml;r die rein sequentiellen Bl&ouml;cke (basic blocks) einer Funktion berechnet, die dann nachher unter Zuhilfenahme des Kontrollflu&szlig;graphen vereinigt werden. Nachdem die Graphen f&uuml;r einzelne Funktionen erzeugt worden sind, werden anschlie&szlig;end die Teile der Graphen entfernt, die nicht zur Repr&auml;sentation der von au&szlig;en sichtbaren Effekten dienen. Die eine Funktion repr&auml;sentierenden Graphen werden auf diese Weise deutlich kleiner, was zu einer Effizienssteigerung f&uuml;r die nachfolgenden Schritte f&uuml;hrt. Die reduzierten Graphen werden dann gem&auml;&szlig; der existierenden Funktionsaufrufe miteinander vereinigt (interprozedurale Analyse). Hierbei werden indirekte Funktionsaufrufe (&uuml;ber Zeiger auf Funktionen) zun&auml;chst ignoriert. Erst wenn im Rahmen der Analyse festgestellt wird welche Funktionen ein solcher Aufruf aufrufen k&ouml;nnte, werden auch die zu diesem Aufruf geh&ouml;renden Graphen vereinigt. Funktionen die an mehreren Stellen aufgerufen werden, werden hierbei solange wie m&ouml;glich unter Ber&uuml;cksichtigung des jeweiligen Aufruf-Kontext betrachtet. <br /> Ein wesentlicher Vorteil dieses Algorithmus besteht darin, da&szlig; er f&uuml;r viele reale ANSI-C-Programme verwendet werden kann, da nur sehr wenige Einschr&auml;nkungen notwendig waren (Assembler-Code, Interrupt-Handling, volatile-Attribute und I/O-basierte Aliase). Der Algorithmus behandelt die Effekte von Strukturen und Unions, beliebiger Verwendung von Zeigern, Typ-Umwandlungen und Zeigern auf Funktionen. Da dies dazu f&uuml;hrt, da&szlig; sich der Algorithmus nicht auf die vorhanden Typ-Informationen st&uuml;tzen kann, basieren die erzeugten Graphen auf einem Speichermodell auf niedriger Ebene. Der Algorithmus wurde mit Hilfe des SUIF-Compilers implementiert und erfolgreich mit einer Reihe von realen Programmen getestet
    corecore