g++优化小写到大写- bug

g++ optimizing lowercase to uppercase - bug?

本文关键字:bug g++ 优化      更新时间:2023-10-16

我在使用g++ 4.1.2时遇到了一个非常奇怪的问题。我有一个非常基本的程序,可以打开一个串行端口并向其写入数据。端口已打开&使用以下命令进行设置:

fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
struct termios port_settings;
cfsetispeed(&port_settings, B115200);
cfsetospeed(&port_settings, B115200);
port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &port_settings);

我有一个由ASCII常量组成的char数组要通过串行链路发送。数据写入使用直接的write(fd, &serial_out, 1), serial_out是要写入的字符。然后将这些数据显示在16x2的LCD上。

奇怪的是。只要我用-O0编译,这一切都很好。但是,如果我用更大的数字(1、2、3或s)编译,所有小写字符在LCD上显示为大写。

有谁知道是什么原因引起的吗?我可能忽略了一些简单的东西,但我真的不知道。

这是因为您基本上是将终端参数设置为随机值。

要获得更有意义的行为,首先询问串行端口的设置,然后更改您认为合适的项目:

struct termios port_settings;
if (tcgetattr (fd, &port_settings) != 0)
            return -1;
cfsetispeed(&port_settings, B115200);
cfsetospeed(&port_settings, B115200);
port_settings.c_cflag &= ~(PARENB|CSTOPB|CSIZE);
port_settings.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &port_settings);

您必须问自己的问题是,serial_out在传递给write()时是否具有正确的值,此后它在库调用中,并且编译单元的优化级别将没有影响。

优化和未优化代码之间的大多数行为变化是由于使用未定义的实现定义的编译器行为,这可能在不同的编译设置之间发生变化。您可能需要在这里显示与变量serial_out相关的代码,而不是与端口配置相关的代码。

理想情况下,使用调试器在调用write()时检查值,尽管有时很难使用优化的代码,并且您可能需要检查已优化的变量的寄存器。