1

Android に移植したい既存の C++ プロジェクトがあります。残念ながら、このプログラムは Android で「Fatal signal 7 (SIGBUS)」エラーを引き起こします。他のプラットフォーム (32 ビット/64 ビットの Linux および Windows) では問題なく動作しています。問題を引き起こすコードの一部は次のとおりです。

RawMem3::RawMem3(uint8_t packet_version, uint32_t flags, uint64_t packet_id,
    uint64_t packet_nr, uint64_t timestamp, vector<uint16_t>& nr_channels,
    vector<uint16_t>& samples_per_channel, vector<double>& data) :
    size_(0) {

size_ = sizeof(packet_version) + sizeof(size_) + sizeof(flags)
        + sizeof(packet_id) + sizeof(packet_nr) + sizeof(timestamp)
        + nr_channels.size() * sizeof(boost::uint16_t)
        + samples_per_channel.size() * sizeof(boost::uint16_t)
        + data.size() * sizeof(float); // FIXXXXXME  ...  hardcoded sizeof() !!!!

mem_ = malloc(size_);

uint8_t* ui8_ptr = reinterpret_cast<uint8_t*>(mem_);
*ui8_ptr++ = packet_version;

uint32_t* ui32_ptr = reinterpret_cast<uint32_t*>(ui8_ptr);
*ui32_ptr++ = size_;
*ui32_ptr++ = flags;

uint64_t* ui64_ptr = reinterpret_cast<uint64_t*>(ui32_ptr);
*ui64_ptr++ = packet_id;
*ui64_ptr++ = packet_nr;

uint64_t* time_ptr = reinterpret_cast<uint64_t*>(ui64_ptr);
*time_ptr++ = timestamp;

uint16_t* ui16_ptr = reinterpret_cast<uint16_t*>(time_ptr);

for (unsigned int n = 0; n < nr_channels.size(); n++)
    *ui16_ptr++ = nr_channels[n];
for (unsigned int n = 0; n < samples_per_channel.size(); n++)
    *ui16_ptr++ = samples_per_channel[n];

try {
    float* flt_ptr = reinterpret_cast<float*>(ui16_ptr);
    for (unsigned int n = 0; n < data.size(); n++)
        *flt_ptr++ = numeric_cast<float>(data[n]);
} catch (negative_overflow& e) {
    cerr << "RawMem -- Constructor: " << e.what();
} catch (positive_overflow& e) {
    cerr << "RawMem -- Constructor: " << e.what();
} catch (bad_numeric_cast& e) {
    cerr << "RawMem -- Constructor: " << e.what();
}

厳密に言えば、この部分:

uint32_t* ui32_ptr = reinterpret_cast<uint32_t*>(ui8_ptr);
*ui32_ptr++ = size_;
*ui32_ptr++ = flags

アライメントの問題だと思います。私はその専門家ではないので、これを修正する方法はありますか?私はすでに に変更しようとしpacket_versionましたuint32_t。その後、SIGBUS エラーはなくなりましたが、私のクライアント ソフトウェアpacked_versionuint8_t. クライアント コードを変更できないため、別の方法で修正する必要があります。

4

1 に答える 1