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.

[参考译文] MSP430F6779A:关于编译器不正确地 elides &&当右边的操作数有可能调用未定义的运行状态时(CodeGen-7956)

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1347313/msp430f6779a-about-compiler-incorrectly-elides-short-circuit-behavior-of-when-right-operand-might-invoke-undefined-behavior-codegen-7956

器件型号:MSP430F6779A

我对编译器已解决 MSP430_20.2.5.LTS*中的缺陷有一些疑问。

software-dl.ti.com/.../README.html
CodeGen-7956编译器在右侧操作数可能调用未定义行为时错误地避免了&&的短路行为

1) 1)所有优化级别设置(我们当前使用-opt_level=0)是否都出现此错误 CodeGen-7956?

2) 2)您是否有任何有关此错误 CodeGen-7956的 C 语言简单示例?

3)我们是否应该升级编译器版本(目前我们使用版本20.2.1)?

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

    嗨、

    1) 1)所有优化级别设置(我们当前使用-opt_level=0)是否都出现此错误 CodeGen-7956?

    [/报价]

    -opt_level=0将执行基本的表达式简化、从对问题的描述来看、即使在那里也可能会发生这种情况。 -opt_level=off 是我希望问题不再发生的地方。

    2) 2)您是否有任何有关此错误 CodeGen-7956的 C 语言简单示例?

    [/报价]

    请参阅此主题、了解发生这种情况并可以进行更正的一个示例: https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/975748/compiler-am5726-question-about-codegen-7956/3608154#3608154

    https://sir.ext.ti.com/jira/browse/EXT_EP-9945 还包含问题发生时间的一般说明。  

    3)我们是否应该升级编译器版本(目前我们使用的是版本20.2.1)?
    [/quote]

    我推荐这个。 根据上面的 Jira 条目,这是在20.2.5中固定的。

    此致、
    布兰登·费舍尔

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

    您好、Brandon Fisher。

    感谢提供信息。

    我在下面找到了一些简单的代码说明。

    e2e.ti.com/.../3608154

    Here is a workaround to consider.
    
    The problem code fragment is ...
    
    	if (this->moduleActivated && (encoderChannel < this->channelCount))
    	{
    		if (this->fpgaPacket.status[encoderChannel].fields.markerStatus == 1)
    		{
    			markerStatus = true;
    		}
    	}
    
    One workaround is to change it to ...
    
            bool activated = this->moduleActivated;
    	
            if (activated && (encoderChannel < this->channelCount))
    	{
    		if (this->fpgaPacket.status[encoderChannel].fields.markerStatus == 1)
    		{
    			markerStatus = true;
    		}
    	}
    
    

    在我的理解中、

    如果使用带有指针变量去引用检查条件的 if else 语句、则会发生此错误。

    如果不使用指针变量去参考的检查条件、那么没问题吧?

    现在、我不喜欢更改编译器、因为它需要对所有测试进行回归以进行确认。

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

    嗨、

    在这种情况下、您的解释是正确的。

    更一般地说、问题在 我之前分享的错误跟踪描述中给出:

    优化器错误地优化了表达式、并在阻止执行表达式的测试之前移动了一个调用未定义行为的表达式。 具体而言、优化器将空指针解除引用移动到测试之前的点、该测试应防止对空指针解除引用。 相关的优化基本上如下。 假设

    如果(X) Y = Z;否则 Y = W

    Y =(X? Z:W)

    其中 X、Y、Z 和 W 全部是 bool 或 single-bit 字段、而 Z 或 W 中的一个是常数0、优化器会产生

    Y =(X&Z)|(! X)&W)

    (用户的代码可能与上述代码不完全相同、因为优化器可以通过重新排列逻辑上类似的代码序列来生成上述代码。) 问题在于、在原始表达式中、W 可能是由 X 保护的空指针解除引用。在原始代码中、如果 X 为 true、则不会执行 W、但在新代码中、始终会执行 Z 和 W。 修复方法是使优化器生成

    Y =(X&Z)|||(! X)&&W)

    如果 Z 和/或 W 经推测证明可以安全执行、那么优化器中稍后的优化会将&&运算符转变为&运算符。

    此致、
    布兰登·费舍尔