Automatic Tracking of Null Dereferences to Inception with Causality Traces

Total Page:16

File Type:pdf, Size:1020Kb

Automatic Tracking of Null Dereferences to Inception with Causality Traces View metadata, citation and similar papers at core.ac.uk brought to you by CORE provided by UCL Discovery Casper: Automatic Tracking of Null Dereferences to Inception with Causality Traces Benoit Cornu*, Earl T. Barr†, Lionel Seinturier*, Martin Monperrus* *University of Lille & INRIA †University College London Abstract: Fixing a software error requires under- 1 Exception in thread"main" java.lang.NullPointerException standing its root cause. In this paper, we introduce 2 at [..].BisectionSolver.solve(88) 3 at [..].BisectionSolver.solve(66) “causality traces”, crafted execution traces augmented 4 at ... with the information needed to reconstruct the causal Listing 1: The standard stack trace of a real null chain from the root cause of a bug to an execution dereference bug in Apache Commons Math. error. We propose an approach and a tool, called Casper, based on code transformation, which dy- namically constructs causality traces for null derefer- 1 Exception in thread"main" java.lang.NullPointerException ence errors. The core idea of Casper is to replace 2 Dereferenced parameter “f" // symptom null 3 at [..].BisectionSolver.solve(88) s with special objects, called “ghosts”, that track 4 at [..].BisectionSolver.solve(66) the propagation of the nulls from inception to their 5 at ... 6 Parameter f bound to field “f2” error-triggering dereference. Causality traces are ex- 7 at [..].BisectionSolver.solve(66) tracted from these ghosts. We evaluate our contribu- 8 Field “f2” set to null 9 at [..].UnivariateRealSolverImpl.<init>(55) // tion by providing and assessing the causality traces of cause 14 real null dereference bugs collected over six large, popular open-source projects. Listing 2: What we propose: a causality trace, an extended stack trace that contains the root cause. 1 Introduction assignment of a null value, by means of a causality Null pointer dereferences are frequent errors that trace — the execution path the null took through the cause segmentation faults or uncaught exceptions. code from its inception to its dereference. Li et al. found that 37.2% of all memory errors The literature offers different families of techniques in Mozilla and Apache are null dereferences [15]. to compute the root cause of bugs, mainly program Kimura et al. [14] found that there are between one slicing, dataflow analysis, or spectrum-based fault- and four null checks per 100 lines of code on aver- localization. However, they have been little studied age. Problematic null dereferences are daily reported and evaluated in the context of identifying the root in bug repositories, such as bug MATH#3051. A null cause of null dereferences [11,4, 24]. Those techniques dereference occurs at runtime when a program tries are limited in applicability ([11] is an intra-procedural to read memory using a field, parameter, or variable technique) or in accuracy (program slicing results in that points to “null”, i.e. nothing. The terminology large sets of instructions [3]). The fundamental prob- changes depending on the language, in this paper, lem not addressed in the literature is that the causal- we concentrate on the Java programming language, ity trace from null inception to the null symptom is where a null dereference triggers an exception called missing. This is the problem that we address in this NullPointerException, often called “NPE”. paper. We propose a causality analysis technique that Just like any bug, fixing null dereferences requires uncovers the inception of null variable bindings that understanding their root cause, a process that we call lead to errors along with the causal explanation of null causality analysis. At its core, this analysis is how null flowed from inception to failure during the the process of connecting a null dereference, where execution. While our analysis may not report the root the fault is activated and whose symptom is a null cause, it identifies the null inception point with cer- pointer exception, to its root cause, usually the initial tainty, further localizing the root cause and speeding 1https://issues.apache.org/jira/browse/MATH-305 debugging in practice. 1 Let us consider a concrete example. Listing 1 ciousness values and does not collect causality traces shows a null dereference stack trace which shows nor identifies null inception points with certainty. that the null pointer exception happens at line 88 We evaluate our contribution Casper by providing of BisectionSolver. Let’s assume that a perfect fault and assessing the causality traces of 14 real null deref- localization tool suggests that this fault is located erence bugs collected over six large, popular open- at line 55 of UnivariateRealSolverImpl (which is source projects. We collected these bugs from these where the actual fault lies). However, the developer project’s bug reports, retaining those we were able to is left clueless with respect to the relation between reproduce. Casper constructs the complete causal- line 55 of UnivariateRealSolverImpl and line 88 of ity trace for 13 of these 14 bugs. For 11 out of these BisectionSolver where the null dereference happens. 13 bugs, the causality trace contains the location of What we propose is a causality trace, as shown in the actual fix made by the developer. Listing 2. In comparison to Listing 1, it contains three To sum up, our contributions are: additional pieces of information. First, it gives the exact name, here f, and kind, here parameter (local • The definition of causality traces for null derefer- variable or field are other possibilities), of the variable ence errors from null inception to its dereference 2 that holds null . Second, it explains the inception of and the concept of “ghost” classes, which replace the null binding to the parameter, the call to solve null, collect causality traces, while being other- at line 66 with field f2 passed as parameter. Third, wise indistinguishable from null. it gives the root cause of the null dereference: the • A set of code transformations that inject null assignment of null to the field f2 at line 55 of class ghosts and collect causality traces of null deref- UnivariateRealSolverImpl. Our causality traces con- erences. tain several kinds of causal links, of which Listing 2 shows only three: the name of the wrongly derefer- • Casper, an Java implementation of our tech- enced variable, the flow of a null binding through pa- nique. rameter bindings, and null assignment. Section 2.2 • An evaluation of our technique on 14 real null presents the concept of null causality trace. dereference bugs collected over 6 large open- We present Casper, a tool that transforms Java source projects. programs to capture causality traces and facilitate the fixing of null deferences3. Casper takes as input the The remainder of this paper is structured as fol- program under debug and a main routine that triggers lows. Section2 presents our technical contribution. the null dereference. It first instruments the program Section3 gives the results of our empirical evalua- under debug by replacing null with “ghosts” that are tion. Section4 discusses the limitations of our ap- shadow instances responsible for tracking causal infor- proach. Sections5 and6 respectively discusses the mation during execution. To instrument a program, related work and concludes. Casper and our bench- Casper applies a set of 11 source code transforma- mark can be downloaded from https://github.com/ tions tailored for building causal connections. For Spirals-Team/casper. instance, x = y is transformed into o = assign(y) , where method assign stores an assignment causal links in a null ghost (Section 2.3). Section 2.4 details 2 Debugging Nulls with Casper these transformations. Casper tracks the propagation of a null binding dur- Casper Compared to the related work, is novel ing application execution in a causality trace. A null along three dimensions. First, it collects the complete dereference causality trace is a sequence of program el- causality trace from the inception of a null binding ements (AST nodes) traversed during execution from to its dereference. Second, it identifies the inception the source of the null to its erroneous dereference. of a null binding with certainty. Third, Casper is lightweight and easily deployable, resting on trans- formation rather than replacing the Java virtual ma- 2.1 Overview chine, a la Bond et al. [4]. The first two properties We replace nulls with objects whose behavior, from strongly differentiate Casper from the related work the application’s point of view, is same as null, ex- [20,4], which tentatively labels root causes with suspi- cept that they store a causality trace, defined in Sec- null ghosts 2 tion 2.2. We call these objects and detail if the dereference is the result of a method invocation, we Casper give the code expression that evaluates to null them in Section 2.3. rewrites the program 3We have named our tool Casper, since it injects “friendly” under debug to use null ghosts and to store a null’s ghosts into buggy programs. causality trace in those null ghosts, (see Section 2.4). 2 We instantiated Casper’s concepts in Java and there- Mnemonic Description Examples fore tailored our presentation in this section to Java Inception (Section 2.5). x = null; Casper makes minimal assumptions on the appli- L Object x = null cation under debug, in particular, it does not assume null literal return null; a closed world where all libraries are known and ma- nipulable. Hence, a number of techniques used in void foo(Object x) P null at method entry Casper comes from this complication. {...} Propagation 2.2 Null Dereference Causality Trace //foo returns null x = foo() R null at return site To debug a complex null dereference, the developer foo().bar() has to understand the history of a null binding from bar(foo()) its inception to its problematic dereference. When a variable is set to null, we say that a null binding is A null assignment x = e; created.
Recommended publications
  • Enabling RUST for UEFI Firmware
    presented by Enabling RUST for UEFI Firmware UEFI 2020 Virtual Plugfest August 20, 2020 Jiewen Yao & Vincent Zimmer, Intel Corporation www.uefi.org 1 Jiewen Yao • Jiewen Yao is a principal engineer in the Intel Architecture, Graphics, and Software Group. He has been engaged as a firmware developer for over 15 years. He is a member of the UEFI Security sub team, and the TCG PC Client sub working group. www.uefi.org 2 Vincent Zimmer • Vincent Zimmer is a senior principal engineer in the Intel Architecture, Graphics, and Software Group. He has been engaged as a firmware developer for over 25 years and leads the UEFI Security sub team. www.uefi.org 3 Agenda • EDKII Security Summary • RUST Language • Enabling RUST for EDKII • Summary / Call to Action www.uefi.org 4 EDKII Security Summary www.uefi.org 5 BIOS Memory Issue in Hack Conf www.uefi.org 6 BIOS Security Bug Top Issue Open Source Close Source Buffer Overflow/ 50% 38% Integer Overflow SMM 7% 18% Variable 8% 5% Register Lock 3% 10% www.uefi.org 7 Vulnerabilities in C/C++ Source: Trends, challenges, and strategic shifts in the software vulnerability mitigation landscape – Microsoft, Bluehat IL 2019 www.uefi.org 8 Firmware as Software • Many software issues are also firmware issues. – Buffer Overflow – Integer Overflow – Uninitialized Variable • Software mitigation can be used for firmware mitigation. – (See next page) www.uefi.org 9 3 Levels of Prevention Prevention Method EDKII Open Source Example Eliminate Reduce Attack Surface SMI Handler Profile Vulnerability Static Analysis / Dynamic
    [Show full text]
  • Beyond BIOS Developing with the Unified Extensible Firmware Interface
    Digital Edition Digital Editions of selected Intel Press books are in addition to and complement the printed books. Click the icon to access information on other essential books for Developers and IT Professionals Visit our website at www.intel.com/intelpress Beyond BIOS Developing with the Unified Extensible Firmware Interface Second Edition Vincent Zimmer Michael Rothman Suresh Marisetty Copyright © 2010 Intel Corporation. All rights reserved. ISBN 13 978-1-934053-29-4 This publication is designed to provide accurate and authoritative information in regard to the subject matter covered. It is sold with the understanding that the publisher is not engaged in professional services. If professional advice or other expert assistance is required, the services of a competent professional person should be sought. Intel Corporation may have patents or pending patent applications, trademarks, copyrights, or other intellectual property rights that relate to the presented subject matter. The furnishing of documents and other materials and information does not provide any license, express or implied, by estoppel or otherwise, to any such patents, trademarks, copyrights, or other intellectual property rights. Intel may make changes to specifications, product descriptions, and plans at any time, without notice. Fictitious names of companies, products, people, characters, and/or data mentioned herein are not intended to represent any real individual, company, product, or event. Intel products are not intended for use in medical, life saving, life sustaining, critical control or safety systems, or in nuclear facility applications. Intel, the Intel logo, Celeron, Intel Centrino, Intel NetBurst, Intel Xeon, Itanium, Pentium, MMX, and VTune are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries.
    [Show full text]
  • Precise Null Pointer Analysis Through Global Value Numbering
    Precise Null Pointer Analysis Through Global Value Numbering Ankush Das1 and Akash Lal2 1 Carnegie Mellon University, Pittsburgh, PA, USA 2 Microsoft Research, Bangalore, India Abstract. Precise analysis of pointer information plays an important role in many static analysis tools. The precision, however, must be bal- anced against the scalability of the analysis. This paper focusses on improving the precision of standard context and flow insensitive alias analysis algorithms at a low scalability cost. In particular, we present a semantics-preserving program transformation that drastically improves the precision of existing analyses when deciding if a pointer can alias Null. Our program transformation is based on Global Value Number- ing, a scheme inspired from compiler optimization literature. It allows even a flow-insensitive analysis to make use of branch conditions such as checking if a pointer is Null and gain precision. We perform experiments on real-world code and show that the transformation improves precision (in terms of the number of dereferences proved safe) from 86.56% to 98.05%, while incurring a small overhead in the running time. Keywords: Alias Analysis, Global Value Numbering, Static Single As- signment, Null Pointer Analysis 1 Introduction Detecting and eliminating null-pointer exceptions is an important step towards developing reliable systems. Static analysis tools that look for null-pointer ex- ceptions typically employ techniques based on alias analysis to detect possible aliasing between pointers. Two pointer-valued variables are said to alias if they hold the same memory location during runtime. Statically, aliasing can be de- cided in two ways: (a) may-alias [1], where two pointers are said to may-alias if they can point to the same memory location under some possible execution, and (b) must-alias [27], where two pointers are said to must-alias if they always point to the same memory location under all possible executions.
    [Show full text]
  • Practical C/C++ Programming Part II
    Practical C/C++ programming Part II Wei Feinstein HPC User Services Louisiana State University 7/11/18 Practical C/C++ programming II 1 Topics • Pointers in C • Use in functions • Use in arrays • Use in dynamic memory allocation • Introduction to C++ • Changes from C to C++ • C++ classes and objects • Polymorphism • Templates • Inheritance • Introduction to Standard Template Library (STL) 7/11/18 Practical C/C++ programming II 2 What is a pointer? • A pointer is essentially a variable whose value is the address of another variable. • Pointer “points” to a specific part of the memory. • Important concept in C programming language. Not recommended in C++, yet understanding of pointer is necessary in Object Oriented Programming • How to define pointers? int *i_ptr; /* pointer to an integer */ double *d_ptr; /* pointer to a double */ float *f_ptr; /* pointer to a float */ char *ch_ptr; /* pointer to a character */ int **p_ptr; /* pointer to an integer pointer */ 7/11/18 Practical C/C++ programming II 3 Pointer Operations (a) Define a pointer variable. (b) Assign the address of a variable to a pointer. & /* "address of" operator */ (c) Access the value pointed by the pointer by dereferencing * /* “dereferencing" operator */ Examples: int a = 6; int *ptr; ptr = &a; /* pointer p point to a */ *ptr = 10; /* dereference pointer p reassign a value*/ var_name var_address var_value ptr 0x22aac0 0xXXXX a 0xXXXX 6 7/11/18 Practical C/C++ programming II 4 Pointer Example int b = 17; int *p; /* initialize pointer p */ p = &b; /*pointed addr and value,
    [Show full text]
  • Coverity Static Analysis
    Coverity Static Analysis Quickly find and fix Overview critical security and Coverity® gives you the speed, ease of use, accuracy, industry standards compliance, and quality issues as you scalability that you need to develop high-quality, secure applications. Coverity identifies code critical software quality defects and security vulnerabilities in code as it’s written, early in the development process when it’s least costly and easiest to fix. Precise actionable remediation advice and context-specific eLearning help your developers understand how to fix their prioritized issues quickly, without having to become security experts. Coverity Benefits seamlessly integrates automated security testing into your CI/CD pipelines and supports your existing development tools and workflows. Choose where and how to do your • Get improved visibility into development: on-premises or in the cloud with the Polaris Software Integrity Platform™ security risk. Cross-product (SaaS), a highly scalable, cloud-based application security platform. Coverity supports 22 reporting provides a holistic, more languages and over 70 frameworks and templates. complete view of a project’s risk using best-in-class AppSec tools. Coverity includes Rapid Scan, a fast, lightweight static analysis engine optimized • Deployment flexibility. You for cloud-native applications and Infrastructure-as-Code (IaC). Rapid Scan runs decide which set of projects to do automatically, without additional configuration, with every Coverity scan and can also AppSec testing for: on-premises be run as part of full CI builds with conventional scan completion times. Rapid Scan can or in the cloud. also be deployed as a standalone scan engine in Code Sight™ or via the command line • Shift security testing left.
    [Show full text]
  • Declare Property Class Accept Null C
    Declare Property Class Accept Null C Woesome and nontechnical Joshuah planned inveterately and pull-outs his frontiers sourly and daftly. Unquiet Bernard fly-by very instructively while Rick remains ectotrophic and chastened. Sometimes stereoscopic Addie unnaturalizes her acorns proportionally, but unlidded Cat invert heinously or orientalizes rancorously. Even experts are accepted types and positional parameters and references, and assigns to. Use HasValue property to check has value is assigned to nullable type sometimes not Static Nullable class is a. Thank you declare more freely, declare property class accept null c is useful to provide only one dispiriting aspect of. Here we're defining a suggest that extracts all non-nullable property keys from plant type. By disabling cookies to accept all? The car variable inside counter Person class shouldn't be declared type grass and. Use JSDoc type. Any class property name, null safe code token stream of properties and corresponds to accept a class! Why death concept of properties came into C The decline because not two reasons If the members of a class are private then select another class in C. JavaScript Properties of variables with null or undefined. Type cup type as should pickle the null value variable the pastry of the variable to which null. CS31 Intro to C Structs and Pointers. Using the New Null Conditional Operator in C 6 InformIT. Your extra bet is to get themselves the good group of initializing all variables when you disabled them. This class that null values can declare variables declared inside an exception handling is nullable context switches a varargs in.
    [Show full text]
  • Automated Techniques for Creation and Maintenance of Typescript Declaration Files
    Automated Techniques for Creation and Maintenance of TypeScript Declaration Files Erik Krogh Kristensen PhD Dissertation Department of Computer Science Aarhus University Denmark Automated Techniques for Creation and Maintenance of TypeScript Declaration Files A Dissertation Presented to the Faculty of Science and Technology of Aarhus University in Partial Fulfillment of the Requirements for the PhD Degree by Erik Krogh Kristensen August 8, 2019 Abstract JavaScript was initially a scripting language for creating small interactive web pages. However, massive applications, both web pages and server ap- plications, are increasingly being developed using JavaScript. The dynamic nature of the JavaScript language makes it hard to create proper tooling with features such as auto-completion and code-navigation. TypeScript is a JavaScript superset that adds, on top of JavaScript, an optional static type system, which facilitates features such as auto-completion, code navigation, and detection of type errors. However, many TypeScript applications still use untyped libraries written in JavaScript. Developers or users of these JavaScript libraries can choose to write TypeScript declaration files, which provide API models of the libraries and are used to type-check TypeScript applications. These declaration files are, however, written manually and of- ten not by the original authors of the library, which leads to mistakes that can misguide TypeScript application developers and ultimately cause bugs. The goal of this thesis is to design automated techniques for assisting in the development of TypeScript declaration files. This thesis identifies several challenges faced by developers of TypeScript declaration files and tackles these challenges using techniques from programming language re- search. Type inference is used to create new, and update existing, decla- ration files.
    [Show full text]
  • Mixed Messages: Measuring Conformance and Non-Interference in Typescript
    Mixed Messages: Measuring Conformance and Non-Interference in TypeScript Jack Williams1, J. Garrett Morris2, Philip Wadler3, and Jakub Zalewski4 1 University of Edinburgh, Edinburgh, Scotland [email protected], 2 University of Edinburgh, Edinburgh, Scotland [email protected] 3 University of Edinburgh, Edinburgh, Scotland [email protected] 4 University of Edinburgh, Edinburgh, Scotland [email protected] Abstract TypeScript participates in the recent trend among programming languages to support gradual typing. The DefinitelyTyped Repository for TypeScript supplies type definitions for over 2000 popular JavaScript libraries. However, there is no guarantee that implementations conform to their corresponding declarations. We present a practical evaluation of gradual typing for TypeScript. We have developed a tool for use with TypeScript, based on the polymorphic blame calculus, for monitoring JavaScript libraries and TypeScript clients against the TypeScript definition. We apply our tool, TypeScript TPD, to those libraries in the DefinitelyTyped Repository which had adequate test code to use. Of the 122 libraries we checked, 62 had cases where either the library or its tests failed to conform to the declaration. Gradual typing should satisfy non-interference. Monitoring a program should never change its behaviour, except to raise a type error should a value not conform to its declared type. However, our experience also suggests serious technical concerns with the use of the JavaScript proxy mechanism for enforcing contracts. Of the 122 libraries we checked, 22 had cases where the library or its tests violated non-interference. 1998 ACM Subject Classification D.2.5 [Software Engineering]: Testing and Debugging Keywords and phrases Gradual Typing, TypeScript, JavaScript, Proxies Digital Object Identifier 10.4230/LIPIcs.ECOOP.2017.39 1 Introduction We have good news and we have bad news.
    [Show full text]
  • Chapter 9 Pointers
    Chapter 9 Pointers Objectives ❏ To understand the concept and use of pointers ❏ To be able to declare, define, and initialize pointers ❏ To write programs that access data through pointers ❏ To use pointers as parameters and return types ❏ To understand pointer compatibility, especially regarding pointers to pointers ❏ To understand the role of quality in software engineering Computer Science: A Structured Programming Approach Using C 1 FIGURE 9-1 Derived Types Computer Science: A Structured Programming Approach Using C 2 9-1 Introduction A pointer is a constant or variable that contains an address that can be used to access data. Pointers are built on the basic concept of pointer constants. Topics discussed in this section: Pointer Constants Pointer Values Pointer Variables Accessing Variables Through Pointers Pointer Declaration and Definition Declaration versus Redirection Initialization of Pointer Variables Computer Science: A Structured Programming Approach Using C 3 FIGURE 9-2 Character Constants and Variables Computer Science: A Structured Programming Approach Using C 4 FIGURE 9-3 Pointer Constants Computer Science: A Structured Programming Approach Using C 5 Note Pointer constants, drawn from the set of addresses for a computer, exist by themselves. We cannot change them; we can only use them. Computer Science: A Structured Programming Approach Using C 6 Note An address expression, one of the expression types in the unary expression category, consists of an ampersand (&) and a variable name. Computer Science: A Structured Programming Approach Using C 7 FIGURE 9-4 Print Character Addresses Computer Science: A Structured Programming Approach Using C 8 Note A variable’s address is the first byte occupied by the variable.
    [Show full text]
  • A Name for the Null Pointer: Nullptr (Revision 4) 1. the Problem, And
    Doc No: SC22/WG21/N2431 = J16/07-0301 Date: 2007-10-02 Project: JTC1.22.32 References: Revision of SC22/WG21/N2214 = J16/07-0074 Reply to: Herb Sutter Bjarne Stroustrup Microsoft Corp. Computer Science Dept. 1 Microsoft Way Texas A&M University, TAMU 3112 Redmond WA USA 98052 College Station TX USA 77843-3112 Email: [email protected] Email: [email protected] A name for the null pointer: nullptr (revision 4) 1. The Problem, and Current Workarounds The current C++ standard provides the special rule that 0 is both an integer constant and a null pointer constant. From [C++03] clause 4.10: A null pointer constant is an integral constant expression (expr.const) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type. Two null pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer to cv-qualified type is a single conver- sion, and not the sequence of a pointer conversion followed by a qualification conversion (conv.qual). This formulation is based on the original K&R C definition and differs from the definition in C89 and C99. The C standard [C99] says (clause 6.3.2.3): An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.[55] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
    [Show full text]
  • Object Oriented Programming in Objective-C 2501ICT/7421ICT Nathan
    Subclasses, Access Control, and Class Methods Advanced Topics Object Oriented Programming in Objective-C 2501ICT/7421ICT Nathan René Hexel School of Information and Communication Technology Griffith University Semester 1, 2012 René Hexel Object Oriented Programming in Objective-C Subclasses, Access Control, and Class Methods Advanced Topics Outline 1 Subclasses, Access Control, and Class Methods Subclasses and Access Control Class Methods 2 Advanced Topics Memory Management Strings René Hexel Object Oriented Programming in Objective-C Subclasses, Access Control, and Class Methods Subclasses and Access Control Advanced Topics Class Methods Objective-C Subclasses Objective-C Subclasses René Hexel Object Oriented Programming in Objective-C Subclasses, Access Control, and Class Methods Subclasses and Access Control Advanced Topics Class Methods Subclasses in Objective-C Classes can extend other classes @interface AClass: NSObject every class should extend at least NSObject, the root class to subclass a different class, replace NSObject with the class you want to extend self references the current object super references the parent class for method invocations René Hexel Object Oriented Programming in Objective-C Subclasses, Access Control, and Class Methods Subclasses and Access Control Advanced Topics Class Methods Creating Subclasses: Point3D Parent Class: Point.h Child Class: Point3D.h #import <Foundation/Foundation.h> #import "Point.h" @interface Point: NSObject @interface Point3D: Point { { int x; // member variables int z; // add z dimension
    [Show full text]
  • Towards Support for Non-Null Types and Non-Null-By- Default in Java 1
    Towards Support for Non-null Types and Non-null-by- default in Java Patrice Chalin Dept. of Computer Science and Software Engineering, Dependable Software Research Group, Concordia University Montréal, Québec, Canada [email protected] Abstract. This paper begins with a survey of current programming language support for non-null types and annotations, with a particular focus on extensions to Java. With the advent of Java 5 annotations, we note a marked increase in the availability of tools that can statically detect potential null dereferences. For such tools to be truly effective, they require that developers annotate declarations with nullity modifiers. Unfortunately, it has been our experience in specifying moderately large code bases, that the use of non-null annotations is more labor intensive than it should be. Hence, backed by an empirical study, we recently outlined a proposal for adapting the Java Modeling Language (JML) to support a non-null-by-default semantics. This paper extends our earlier work by providing a detailed description of the changes made to JML in support of the new default. Finally, in relation to our survey, we justify the claim that JML is one of the most fully developed solutions for bringing support for non-null annotations/types to Java. Keywords: non-null annotations, non-null types, Java, JML, non-null by default. 1 Introduction Null pointer exceptions are among the most common faults raised by components written in mainstream imperative languages. Developers increasingly have at their disposal tools that can detect possible null dereferences (among other things) by means of static analysis of component source.
    [Show full text]