nikit created THRIFT-3870:
-----------------------------

             Summary: Impossible cast bugs in generated for java code
                 Key: THRIFT-3870
                 URL: https://issues.apache.org/jira/browse/THRIFT-3870
             Project: Thrift
          Issue Type: Bug
    Affects Versions: 0.9.3
         Environment: windows 7
[libthrift 
0.9.3|https://mvnrepository.com/artifact/org.apache.thrift/libthrift/0.9.3]
[Thrift compiler for Windows 
(thrift-0.9.3.exe)|http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.3/thrift-0.9.3.exe]
            Reporter: nikit


Generated by thrift compiler Java code contains "Impossible cast" bugs.
Affected generated java-code only for service definitions.

For example:
{code:title=myThriftService.thrift|borderStyle=solid}
service MyThriftService {
    i32 multiplyNumbers(1:i32 multiplier, 2:i32 multiplicand);
}
{code}

>From cmd run:
{code}
thrift-0.9.3.exe -r --gen java myThriftService.thrift
{code}

Generated java code:
{code:title=gen-java\\MyThriftService.java|borderStyle=solid}
...
public class MyThriftService {
    ...
    public static class multiplyNumbers<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, multiplyNumbers_args, Integer> {
      ...
      public AsyncMethodCallback<Integer> getResultHandler(final 
AsyncFrameBuffer fb, final int seqid) {
        final org.apache.thrift.AsyncProcessFunction fcall = this;
        return new AsyncMethodCallback<Integer>() { 
          ...
          public void onError(Exception e) {
            ...
                        multiplyNumbers_result result = new 
multiplyNumbers_result();
                        {
                          msgType = 
org.apache.thrift.protocol.TMessageType.EXCEPTION;
                          msg = (org.apache.thrift.TBase)new 
org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR,
 e.getMessage());
                        }
            ..
          } 
          ...
        }
      ...
    }
    ...
}
{code}

Problem is that org.apache.thrift.TApplicationException does not implement 
org.apache.thrift.TBase.

{panel:title=Findbugs description}
Bug: Impossible cast from org.apache.thrift.TApplicationException to 
org.apache.thrift.TBase in 
MyThriftService$AsyncProcessor$multiplyNumbers$1.onError(Exception)

This cast will always throw a ClassCastException. FindBugs tracks type 
information from instanceof checks, and also uses more precise information 
about the types of values returned from methods and loaded from fields. Thus, 
it may have more precise information that just the declared type of a variable, 
and can use this to determine that a cast will always throw an exception at 
runtime. 

Rank: Scary (9), confidence: High
Pattern: BC_IMPOSSIBLE_CAST 
Type: BC, Category: CORRECTNESS (Correctness)
{panel}






--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to