请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 替换、则不会触发故障
这是一个意想不到的地方,看起来很随意……