You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 43 Next »

Methods should always try to return a value that allows the developer to learn about the current state of the object and/or the result of an operation. This is consistent with the advice in guideline EXP00-J. Do not ignore values returned by methods. The returned value should be as representative of the last known state as possible and should be chosen keeping in mind the perceptions and mental model of the developer.

Feedback can also be provided by throwing either standard or custom exception objects derived from the Exception class. With this approach, the developer can still get precise information about the outcome of the method and proceed to take the necessary actions. To do so, the exception should provide a detailed account of the abnormal condition at the appropriate abstraction level.

To gain better ability at telling apart correct from fallacious results and enforcing that the incorrect results be carefully handled, a combination of the aforementioned approaches is recommended. At the same time, there are cases when an error value should be returned instead of an exception and vice versa. For instance, if some method is capable of failing in a variety of different ways, it is better to return failure codes than endeavoring to throw scores of different exceptions. Note that no possible failure codes should be within the range of valid return values.

Sometimes a state testing method [[Bloch 2008]] can be used to ensure that the object is in consistent state at all points in time. This approach is not useful in the absence of external synchronization. There is also a TOCTOU race condition between invocation of the object's state testing method and the call to a method that depends on the object's state. During this interval, the object's state could change surreptitiously.

A method should not return a value or error code that does not accurately specify the object state. Clients should be able to rely on the value for performing critical decisions.

Noncompliant Code Example

As shown in this example, noncompliant methods can silently corrupt the state of the object if they do not return a value that the developer can intuitively interpret.

public void updateNode(int id, int newValue){		
  Node current = root;
  while(current != null){
    if(current.getId() == id){
      current.setValue(newValue);
      break;
    }
    current = current.next;
  }
}

Compliant Solution

This compliant solution returns the result of the operation; true for success and false for failure.

public boolean updateNode(int id, int newValue){		
  Node current = root;
  while(current != null){
    if(current.getId() == id){
      current.setValue(newValue);
      return true; // Node successfully updated
    }
    current = current.next;
  }
  return false;
}

Compliant Solution

This compliant solution returns the updated Node so that the developer can simply check for a null value lest the operation fails. Return values for methods can vary depending on the control flow or the information that the developer finds more useful.

public Node updateNode(int id, int newValue){	
  Node current = root;
  while(current != null){
    if(current.getId() == id){
      current.setValue(newValue);
      return current;
    }
    current = current.next;
  }
  return null;
}

Compliant Solution

This solution combines the best of both worlds - exceptions and status codes. In this case, an exception is thrown if the operation is not successful. This ensures that the client has to handle the event wherein the Node is not found. If the Node is found, it is updated and returned.

public Node updateNode(int id, int newValue) throws IdNotFoundException {
  Node current = root;
  while(current != null){
    if(current.getId() == id){
      current.setValue(newValue);
      return current;
    }
    current = current.next;
  }	
  throw new NodeNotFoundException();
}

Risk Assessment

Failure to provide appropriate feedback through return values, error codes and exceptions can lead to inconsistent object state and unexpected program behavior.

Guideline

Severity

Likelihood

Remediation Cost

Priority

Level

MET09-J

medium

probable

medium

P8

L2

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this guideline on the CERT website.

Other Languages

This guideline is similar to the C Secure Coding Standard recommendation ERR02-C. Avoid in-band error indicators

This guideline is similar to the C++ Secure Coding Standard recommendation ERR02-CPP. Avoid in-band error indicators

Bibliography

[[Ware 2008]]
[[MITRE 2009]] CWE ID 393 "Return of Wrong Status Code" and CWE ID 389 "Error Conditions, Return Values, Status Codes"


MET52-J. Do not use the clone method to copy untrusted method parameters      05. Methods (MET)      MET54-J. For methods that return an array or collection prefer returning an empty array or collection over a null value

  • No labels