0

おはようございます。Sun Solaris OS 5.8 の int * キャストに関連するセグメンテーション エラーを gcc バージョン 3.3 で修正できますか? gdb 変数の値を以下に示します。cOrderedList クラスのメンバー変数を以下に示します。uname -a と gcc -v の出力を以下に示します。
このコードは、Windows Visual Studio C++ 9.0 で正常に動作します。ありがとうございます。

【新LWP1】

プログラム受信信号 SIGSEGV、セグメンテーション違反。
cOrderedList::LoadDatabaseRecords(cSQLite*, char const*) の 0xff064b04 (
    this=0x68f10、データベース_=0xa4ba8、
    Command_=0xffbed468 "SELECT * FROM LeftPattern")
    ../Source/cOrderedList.cpp:272 で
272 *((int*) (Records+RecordCount*RecordSize+FieldOffsets[i]))=Database_->ColumnInt(i);
(gdb) プリント i
$3 = 3
(gdb) 印刷レコード
$4 = 0xa0800 ""
(gdb) レコード数を出力
$5 = 0
(gdb) プリントレコードサイズ
$6 = 50
(gdb) フィールドオフセット[i] を印刷
$7 = 46
class cOrderedList {
private:
    enum eFieldTypes {
        Character,
        Integer
    };

    bool CopyConstructed;

    int RecordCount;
    int FieldCount;
    int RecordSize;

    char *Records;
    int *FieldSizes,*FieldOffsets;
    eFieldTypes *FieldTypes;

    char *CurrentPos;
$ ウナメ -a
SunOS 5.8 Generic_108528-22 sun4u sparc SUNW、Sun-Fire-V210

$ gcc -v
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/specs から仕様を読み取る
構成: ../configure --disable-nls --with-as=/usr/ccs/bin/as --with-ld=
/usr/ccs/bin/ld
スレッドモデル: posix
bool cOrderedList::LoadDatabaseRecords(cSQLite *Database_,const char *Command_) {
int retVal;
char str[4096];

RetrySQL:
RecordCount=0;
Database_->Prepare(Command_);
while ((retVal=Database_->Step())!=SQLITE_DONE) {
    switch (retVal) {
    case SQLITE_ROW:
        for (int i=0;i<FieldCount;i++) {
            if (FieldTypes[i]==Integer) {
                *((int*)   (Records+RecordCount*RecordSize+FieldOffsets[i]))=Database_->ColumnInt(i);
            } else {
                Database_->ColumnText(i,str);
                LTrim(str);
                RTrim(str);

                #if defined(_DEBUG)
                    if ((int) strlen(str)>=FieldSizes[i])
                        printf("Field not large enough: %s\n",Command_);
                #endif

                strncpy(Records+RecordCount*RecordSize+FieldOffsets[i],str,FieldSizes[i]);
                Records[RecordCount*RecordSize+FieldOffsets[i]+FieldSizes[i]-1]='\x0';
            }
        }
        RecordCount++;
        break;
    case SQLITE_BUSY:
        continue;
    case SQLITE_MISUSE:
        goto RetrySQL;
    default:
        break;
    }
}
return true;
}
4

3 に答える 3

0

たぶん、この操作: "(Records+RecordCount*RecordSize+FieldOffsets[i])" は、レコード境界のサイズを超える値を返しています。

コードのこの部分だけを見るとわかりにくいですが、これは両方のプラットフォームの sizeof(char) の違いが原因である可能性があります...

于 2012-09-19T16:36:37.933 に答える
0

こんにちは、問題は gcc コード生成のバグでもバッファ オーバーランでもないことが判明しました。次のソリューションは、このコードを使用して数分前に Solaris でテストされました。

     int32_t x = Database->ColumnInt(i);
     memcpy(Records+RecordCount*RecordSize+FieldOffsets[i], &x, sizeof(int32_t));

すべての回答とコメントに感謝します。

于 2012-09-19T20:38:59.083 に答える