15.01.2015 Views

4th International Conference on Principles and Practices ... - MADOC

4th International Conference on Principles and Practices ... - MADOC

4th International Conference on Principles and Practices ... - MADOC

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

class Class {<br />

/*@n<strong>on</strong>_null@*/ String attribute;<br />

Class() {<br />

attribute = "Attribute";<br />

}<br />

void set(/*CANAPA*//*@n<strong>on</strong>_null@*/ String param) {<br />

attribute = param;<br />

}<br />

}<br />

And that is exactly what our applicati<strong>on</strong> does. There is<br />

another possible way to correct this error - it involves enclosing<br />

the assignment in if-else statement. However, it is<br />

impossible for the tool to guess what to do if param is null.<br />

5.2 Example 2<br />

This example shows the inference of a /*@ n<strong>on</strong>_null @*/<br />

annotati<strong>on</strong> to a variable or parameter, of which a programmer<br />

invokes a method. Let's c<strong>on</strong>sider the following piece of<br />

code:<br />

class ClassA {<br />

public A(){}<br />

public void methodA(){}<br />

}<br />

class ClassB {<br />

public B(){}<br />

public void methodB(ClassA a){<br />

a.methodA();<br />

}<br />

}<br />

This code is invalid, as the parameter a of methodB could be<br />

null. So the method call a.methodA() may cause a null<br />

pointer excepti<strong>on</strong>. To correct the error, <strong>on</strong>e should add<br />

a /*@ n<strong>on</strong>_null @*/ annotati<strong>on</strong> to the parameter in the<br />

methodB header. After launching our applicati<strong>on</strong>, the code<br />

will be modied as follows:<br />

class ClassA {<br />

public A(){}<br />

public void methodA(){}<br />

}<br />

class ClassB {<br />

public B(){}<br />

public void<br />

methodB(/*CANAPA*//*@n<strong>on</strong>_null@*/ClassA a){<br />

a.methodA();<br />

}<br />

}<br />

Of course the problem c<strong>on</strong>cerns not <strong>on</strong>ly parameters, but<br />

also variables:<br />

class Class{<br />

public Class(){}<br />

public void method(){<br />

String str;<br />

str.substring(1);<br />

}<br />

}<br />

The local variable str cannot be null, otherwise the method<br />

call str.substring(1) would cause a null pointer excepti<strong>on</strong>.<br />

The soluti<strong>on</strong> is to declare str as /*@ n<strong>on</strong>_null @*/.<br />

CANAPA will add the appropriate annotati<strong>on</strong>. Of course,<br />

the problem persists (str is uninitialized), but this time,<br />

ESC/Java2 error points the user exactly to the source of<br />

the problem.<br />

5.3 Example 3<br />

This example shows how a /*@ n<strong>on</strong>_null @*/ annotati<strong>on</strong><br />

can be propagated to the method's result.<br />

class Class{<br />

/*@ n<strong>on</strong>_null @*/ String attribute;<br />

public Class(){<br />

attribute = "Attribute";<br />

}<br />

private String getString(){<br />

return "This is a string";<br />

}<br />

public void set(){<br />

attribute = getString();<br />

}<br />

}<br />

a<br />

We assign the result of getString() to attribute, which<br />

b<br />

is declared as /*@ n<strong>on</strong>_null @*/. Until we are not sure that<br />

the method getString() cannot return a null, this code will<br />

be incorrect. The easiest way to solve this problem is to add<br />

/*@ n<strong>on</strong>_null @*/ annotati<strong>on</strong> to the result of getString().<br />

The code modied by CANAPA will be as follows:<br />

class Class{<br />

/*@ n<strong>on</strong>_null @*/ String attribute;<br />

public Class(){<br />

attribute = "Attribute";<br />

}<br />

private /*@ n<strong>on</strong>_null @*/ String getString(){<br />

return "This is a string";<br />

}<br />

public void set(){<br />

attribute = getString();<br />

}<br />

}<br />

5.4 Example 4<br />

This example shows that there are situati<strong>on</strong>s, when a<br />

propagati<strong>on</strong> should not be d<strong>on</strong>e, although <strong>on</strong>e could think<br />

that an annotati<strong>on</strong> should be added. C<strong>on</strong>sider following<br />

piece of code:<br />

class Class{<br />

String attribute;<br />

void doSomething(){<br />

...<br />

/*@n<strong>on</strong>_null@*/String str = attribute;<br />

}<br />

void setNull(){<br />

attribute = null;<br />

}<br />

}<br />

One might expect that CANAPA will add an annotati<strong>on</strong> to<br />

the attribute, modifying the code as follows:<br />

class Class{<br />

/*@n<strong>on</strong>_null@*/ String attribute;<br />

void doSomething(){<br />

...<br />

139

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!