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.

[参考译文] F29H850TU:编译器停止函数编译

Guru**** 2419530 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1535122/f29h850tu-compiler-stops-compilation-of-function

器件型号:F29H850TU


工具/软件:

我们观察到、如果写入地址 0x00000000 (NULL)、编译器不会继续编译函数。
使用优化级别“O1"进行“进行编译时会发生此行为(我们尚未使用更高的优化级别进行测试):

优化级别“-O0"不“不受以下影响:

我们知道不允许写入地址 0x00000000(复位向量)、但我们不会假定出现此类行为。
特别是、在这种情况下、编译器不会报告任何警告或错误。

为了在您这边重现此问题、 我们修改了 SDK 的示例“led_ex1_blinky.c":“:

#include "board.h"

int main (void)
{
    Device_init();
    Board_init();
    
    /* Compiler stops compilation of `main()` at this point when compiling with optimization level `-O1`.
     * No compilation warning or error is reported. However, compiling with `-O0` works as expected. */
    uint32_t *const addr = NULL;
    (*addr) = 0xdeadbeef;
    
    for(;;)
    {
        GPIO_writePin(myBoardLED1_GPIO, 0);
        DEVICE_DELAY_US(1000000);
        GPIO_writePin(myBoardLED1_GPIO, 1);
        DEVICE_DELAY_US(1000000);
    }
}

我们使用基于 makefile 的构建来构建示例:“gmake -s led_ex1_blinky.c profile={DEBUG_O0|debug_O1}config=flash“
使用的编译器:“TI C29 Clang 编译器 1.0.0.LTS“

提前感谢大家。

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

    取消引用 NULL 指针是未定义行为的一个示例。  当发生未定义的行为时、编译器不需要以任何特定方式运行。  在这种情况下、编译器不会为以下器件生成代码:

    • 包含未定义行为的语句
    • 函数的返回指令
    • 之间的一切

    这是 CLANG 编译器的典型行为。  考虑 我在编译器资源管理器中创建的这个示例。  在其他 CLANG 编译器中试用。  结果是类似的。

    同样、我提交了 EXT_EP-12697 条目 以请求更改编译器行为。  请理解、这只是一个请求。  不要将其视为编译器发生更改的保证。

    谢谢。此致、

    -乔治

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

    以下是需要考虑的权变措施。  添加选项  -fno-delete-null-pointer-checks. 。  这会禁用此行为...

    如果地址 0x00000000 (NULL) 写入函数、编译器不会继续编译函数

    有关更多详细信息、请 在此页面上搜索选项

    谢谢。此致、

    -乔治