0

プログラム:

#include <stdio.h>
#include <sstream>
int main()
{
    std::stringstream ss;
    ss << "hello world " << 1234 << "\n";
    std::string str = ss.str();
    printf(str.c_str());
    return 0;
}

メイクファイル:

CC=/usr/local/gcc-4.6.2/bin/g++
CFLAGS=-g -c -W -m32 -Wa,-mtune=pentiumiii
LINKFLAGS=-m32 -static-libgcc -static-libstdc++ -Wl,-rpath,./runtime,--dynamic-linker,./runtime/ld-linux.so.2
all:test
test: list_test.o
    $(CC) $(LINKFLAGS) list_test.o -o test 

list_test.o: list_test.cpp
    $(CC) $(CFLAGS) list_test.cpp

clean:
     rm *.o ./test -f

64 ビット Linux でビルドします。Pentinum(R) III CPU を搭載した 32 ビット Linux で実行すると、不正な命令があります。

違法な命令は次のとおりです。

(gdb) disas 0x0804f77a 0x0804f77b
Dump of assembler code from 0x804f77a to 0x804f77b:
0x0804f77a <std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::_M_sync(std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::char_type*, std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::__size_type, std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::__size_type)+138>:     movq   %xmm0,0xc(%esp)

アセンブラー・ダンプの終わり。

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

この命令movq %xmm0,0xc(%esp)は、ストリーミング SIMD 拡張命令 (SSE)命令セットの一部です。Pentium III は理論的には SSE をサポートしていますが、実行しようとしているプロセッサはサポートしていないようです。-mno-sseコンパイラ オプションを使用して、GCC での SSE 命令の生成を無効にすることができます。-march=pentium3Pentium III 以降と互換性のあるコードを生成することもできます。

また、あなたのprintf呼び出しにはバグがあります — 非定数文字列を format 引数 (最初の引数) として渡すべきではありません (ほとんど)。その文字列に%記号が含まれていると、未定義の動作が発生します。せいぜい、これはクラッシュします。最悪の場合、サイレント セキュリティの脆弱性が発生する可能性があります。修正はこれを行うことです:

printf("%s", str.c_str());

printfまたは、C++ を使用しているため、関数のファミリに関する潜在的な問題を完全に回避することをお勧めします。

std::cout << str;  // Optionally also do `<< std::flush'
于 2013-07-16T04:16:36.550 に答える