gpt4 book ai didi

linux - stdc++ 中的非法指令

转载 作者:太空宇宙 更新时间:2023-11-04 09:02:50 27 4
gpt4 key购买 nike

程序:

#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)

汇编程序转储结束。

如何解决这个问题?

最佳答案

指令 movq %xmm0,0xc(%esp)Streaming SIMD Extensions (SSE) 的一部分指令系统。 Pentium III 理论上支持 SSE,但您尝试运行它的处理器显然不支持。您可以使用 -mno-sse 在 GCC 上禁用 SSE 指令的生成编译器选项。你也可以试试 -march=pentium3生成与 Pentium III 及更高版本兼容的代码。

此外,您的 printf 调用有一个错误 — 您(几乎)永远不应该将非常量字符串作为格式参数(第一个参数)传递。如果该字符串恰好包含任何 % 符号,则会导致未定义的行为。充其量,这会崩溃,而在最坏的情况下,您可能会有一个无声的安全漏洞。解决办法是这样做:

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

或者更好的是,完全避免 printf 函数族的潜在问题,因为您使用的是 C++:

std::cout << str;  // Optionally also do `<< std::flush'

关于linux - stdc++ 中的非法指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17667744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com