g++优化小写到大写- bug
g++ optimizing lowercase to uppercase - bug?
我在使用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()
时检查值,尽管有时很难使用优化的代码,并且您可能需要检查已优化的变量的寄存器。
相关文章:
- Clang bug?使用指针作为模板参数
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- C++:编译对无关派生类、bug或特性的函数调用
- Microsoft VC++, vsnprintf, and Pipes (IO) Bug
- Divide et impera sum of the elements of an array bug
- 我正在用 c++ 制作一个小时钟,但遇到了"bug"或某种问题
- Templated Variables Bug With Lambdas in Visual Studio?
- GCC Bug,使用尖括号通过宏包含标头时"linux"路径中的字符串"<>"替换为 "1"
- 我的erase()函数中的bug用于链接列表
- 这个std::vector和std::shared_ptr内存泄漏是一个bug吗
- OS X libc++ std::uniform_real_distribution bug
- Visual Studio or boost::asio bug?
- 按列进行排序后,如何从qtablewidget :: item(qt bug?)中获取正确的行
- 超级怪异的gcc 4.7 segfault——Bug
- C++ WinAPI URLDownloadToFile (urlmon) bug
- Visual Studio regex_iterator Bug?
- Clang bug with std::function, std::bind and std::ref?
- Bug与横幅>加载广告();功能
- c++ 指向另一个类 bug "no operator matches these operands."的指针