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.

[参考译文] 编译器/TM4C129CNCZAD:返回指针的C++调用会导致不对齐的访问错误

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/615255/compiler-tm4c129cnczad-c-calls-that-return-a-pointer-cause-an-unaligned-access-fault

部件号:TM4C129CNCZAD

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

课程板{
公共:
虚拟~Board();
Syslog* syslog(){返回syslog_;};
受保护:
Board()
:syslog_(NULL){};

syslog* syslog_;
}

class BoardImpl : Public Board {
public:
BoardImpl();};


BoardImpl::BoardImpl(): Board(): Board(){
Board::syslog_=syslog::Init();


}void se_function(){ void se_Impl
board;
Board *board_ptr =系统





板;open*/trlashed/>板模式下
的<printah_printf;<_logf_printp>logf;"trl/>

有人能告诉我为什么上面的代码会崩溃吗?  我们使用编译器TMC.5,如果我们使用返回指针的函数调用,然后以这种方式取消引用它,我们就会一直看到这种崩溃在15.12 上发生。  我怀疑编译器做的不对。

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

    如果简单,请构建此代码以在托管系统(如笔记本电脑)上运行。  如果你能做到这一点,它在那里是否有效?

    为了了解发生了什么,我需要一个测试案例,让我能够再现它。  文章 How to Submit a Compiler Test Case 中的说明说明了如何创建一个生成的测试用例,但通常不足以执行。  在这种特殊情况下,我认为您只需要将some函数重命名为main,它将是一个完整的独立程序。  如果这样简单,我希望您能将此测试用例变成一个运行的测试用例。  无论如何,无论您可以提交什么测试案例,我都非常感谢。

    谢谢,此致,

    -George

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

    您好,George,

    ` board_ptr->syslog()->Printf("blah");` works fine in our linux systems with gcc or clang as the compiler, it's only on the TI chip with the TI compiler that I see this issue.  Can you attempt to reproduce it from the code I already posted?  Our compiler options are listed below:

    -mv7m4
    --code_state=16.
    --float_support=FPv4SPD16.

    -关闭
    --check_Misra="All,2.2 ,6.2 ,8.1 ,10.1 ,10.3 ,12.2 ,12.6 ,12.8 ,12.9 ,17.4 ,17.6 ,19.1 ,19.4 ,19.7 ,19.13 ,20.9 ,10.5 20.10 ,-,-MUSR"
    -g
    --gcc --defe=TIVAARE
    --defe=target_is_TM4C129_RA0
    --define=part TM4C129CCCZAD
    --display_error_number
    --EMIT_WARNINS_AS错误
    --diag_warning=225
    --diag_wrap=off
    --gen_func_Subsections=on
    --unalignment_access-off=关闭
    --abi=eabi
    --ual  

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

    [QUETE USER="Kaveh Vaghofi">我们正在使用编译器15.2 .5[/QUET]我认为版本15.2 .........5不存在。 是指5.2 5还是15.12 5?

    [quote user="Kaveh Vaghofi">您是否可以尝试从我已经发布的代码中复制它?我尝试使用TI ARM编译器5.2 v.6或v 15.12 .5重复失败,但未能重现失败。 发布的代码似乎不完整:

    1)不是 Syslog类的代码,因此必须猜测内容。 根据以下行,认为 Syslog::Init是一个静态成员函数:

    Board::syslog_= Syslog::Init(); 

    2) 线路板类的无终端分号存在语法错误。

    3)以下行未编译:

    board board_PTR =板(&B); 

    看起来应该将board_PTR变量声明为指向类Board的指针:

    Board *board_PTR =&board; 

    您能否发布一个完整的可编译代码示例来演示此问题?  

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

    很抱歉,有几个拼写错误,我会修复它们,编译器版本是15.12。5。  我必须删除一堆项目,以便在论坛上发布一个简单的案例,说明我们正在做的事情(我不能只是复制和粘贴我们使用的代码)。  是否有更私密的方式来共享代码?

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

    Kaveh Vaghofi 说:
    是否有更私密的方式来共享代码?[/QUOT]

    是的。 请参阅文章 How to Submit a Compiler Test Case中标题为Protecting Intellectual Property的子部分。

    谢谢,此致,

    -George