[ 
https://issues.apache.org/jira/browse/THRIFT-1932?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Hugo Mildenberger updated THRIFT-1932:
--------------------------------------

    Attachment: thrift-0.9.0-fix-type-punned-pointer-warning.patch

Hi Roger, here is the patch you requested. It does, however, only suppress the 
type-punned pointer warning. Since I'm new to Thrift, I'm quite unsure if the 
sequence of bytes read from file handle 'fd_' is already in host byte order. If 
this is not the case the patch is still wrong 
 
                
> TFileTransport::readEvent() casts values read from input stream into a 
> pointer and then dereferences it.
> --------------------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-1932
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1932
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library
>    Affects Versions: 0.9
>         Environment: Hardened Gentoo amd64 Linux 
>            Reporter: Hugo Mildenberger
>         Attachments: thrift-0.9.0-fix-type-punned-pointer-warning.patch
>
>
> The Compilation of thrift-0.9.0 ended with the following warnings:
>  * QA Notice: Package triggers severe warnings which indicate that it
>  *            may exhibit random runtime failures.
>  * src/thrift/transport/TFileTransport.cpp:715:56: warning: dereferencing 
> type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
>  * src/thrift/transport/TFileTransport.cpp:726:84: warning: dereferencing 
> type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
> When looking into src/thrift/transport/TFileTransport.cpp:715 ...
> 711         readState_.eventSizeBuff_[readState_.eventSizeBuffPos_++] =
> 712           readBuff_[readState_.bufferPtr_++];
> 713         if (readState_.eventSizeBuffPos_ == 4) {
> 714           // 0 length event indicates padding
> 715           if (*((uint32_t *)(readState_.eventSizeBuff_)) == 0) {
> 716             //            T_DEBUG_L(1, "Got padding");
> 717             readState_.resetState(readState_.lastDispatchPtr_);
> 718             continue;
> 719           }
> ... it becomes obvious that the four values casted into a  pointer were 
> previously read from the input stream by ::read() in line 661: 
> 661       readState_.bufferLen_ = ::read(fd_, readBuff_, readBuffSize_);
> Same issue here:
> 725           readState_.event_ = new eventInfo();
> 726           readState_.event_->eventSize_ = 
> \*((uint32_t*)(readState_.eventSizeBuff_));
> 727 
> While it is a two minute job fix this problem, the method 
> TFileTransport::readEvent() looks so fragile that a clean rewrite appears to 
> be more appropriate. 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to