This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 仅在 Windows 10上使用 O2时编译器失败

Guru**** 2487425 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/866937/compiler-failure-with-o2-and-on-windows-10-only

器件型号:TMS320F28377S

工具/软件:TI C/C++编译器

您好!

这是我的圣诞编译器失败;-)

概述

我们最近从 Windows 7切换到了 Windows 10 (最后)。 然后、我们代码库中的一个文件拒绝在版本构建中正确编译。

以下是重现错误的条件:

  • C++
  • 编译器 TI v18.12.4.LTS (未测试的其他编译器)
  • Windows 10 (Windows 7在类似条件下不会发生故障(!))
  • 优化器打开:O2 (O1或优化器关闭时、不会显示故障
  • CCS:9.2.0.00013
  • 故障不会每次发生、仅在大部分时间! (真的、不要开玩笑)

编译器命令行和故障输出

我已将代码最小化至(不再有用)、但仍会触发故障:

cl2000 -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -O2 --opt_for_speed=2 --fp_mode=relaxed -g --ccpu_support=tmu_support=vulations\cpcpru_off\inctrab_members\ccs_ines\cpregions\ccs\ines\cpregions\cpines\ccs\ines\cpinflates\ccs_off-inaturbuls\cpregions\cpregions\cpbuls\cpines\cpines\cpines\cpines\cpines\cpinflag_ines\cpines\cmand\inates\cpreguls\cpines\chon_ines\cmand\ines\cmand\ines\cpines\cpines\cpines\cpinatures\chon_off-ines\cpines\c


opt2000.exe
当处理函数_read_register__26ADT7320_Temperature_SensorFUi 文件 C:\\cygwin64\\tmp\\{623ED5A4-2D7
E-461D-982E-91FD00AFF0C}时

,这是由 TI C/C++优化器中的缺陷引起的。
TI 客户支持可能会建议解决方法来避免这种情况。

升级到编译器的最新版本可能会解决此问题。

在 E2E 支持论坛中联系 TI、网址 为 http://e2e.ti.com
的"Development Tools"、"TI C/C++ Compiler"下。 请参阅标题
为"提交问题"的链接。

我们需要看到整个错误消息和完整、可重现
的测试案例、包括所有命令行选项。
包含由选项--preproc_with_comment 创建的.pp 文件

最小代码示例

被剥离的 killer.cpp 文件如下所示:

struct cmd_byte
{
cmd_Byte (unsigned int 地址、bool 读取):
M_DULE_0 (0)、
M_REGISTER_ADDRESS (地址和0x07)、
m_RW (static_cast (0))、
m_Dumin_1 (0)//、
{}

内联//杀手!
unsigned int to _uint16_t (void);

unsigned int m_dumm_0 :3,
M_REGISTER_ADDRESS :3,
M_RW :1,
m_dummy_1 :9;
};

unsigned int cmd_byte::To_uint16_t (void)
{
返回(m_dummy_0
|(m_register_address << 3)
|(m_dummy_1 << 7)
);
}


类 ADT7320_Temperature_Sensor
{
专用:
void read_register (unsigned int RA);
};



void ADT7320_Temperature_Sensor::read_register (unsigned int RA)
{
CMD_BYTE cmd (RA、TRUE);

unsigned int a[3];
A[0]= cmd.TO_uint16_t ();
}

-preproc_with_comment only 版本看起来完全相同、因为在最小示例中没有使用包含或宏。

权变措施

我们现在的解决方法是删除标有"// killer!"的"内联"行。 但这相当令人不满意、我们想知道发生了什么。

进一步的意见:

  • 上述代码在输入完全相同的情况下、10次运行中会触发大约9次故障
  • 如果从代码的第5行删除了"& 0x07"、则不会触发故障
  • 如果完全移除了第23行、则发生故障的可能性较小(大约为10次的5次)
  • 如果数组 A 被非数组 unsigned int 替换、则不会触发故障

这是一个意想不到的地方,看起来很随意……

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您报告此问题。  您显然投入了大量精力来减少测试案例、因此再次感谢您。  我可以重现相同的行为。  即使是间歇性故障的部件。  我提交 了 SDOWP 系统中的 CodeGen-7011条目、以对此进行调查。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治