【问题标题】:Whole buffer initalization leads to exception整个缓冲区初始化导致异常
【发布时间】:2017-11-05 11:54:24
【问题描述】:

我无法让一段代码正常工作,我有一个使用带有本地缓冲区的函数的代码, 当初始化本地缓冲区时,我得到了异常,但是当没有任何初始化就声明它工作正常,我不明白为什么。 我还增加了链接器中的堆栈大小,但似乎这不是问题。

注意:我正在使用支持整个缓冲区初始化的 c99/c11 编译选项进行编译。

#define UDS_SRV_CFG2_MAX  20

NCS_PRI_FCT tUdsStatus UDS_RdbiManagement(u16 *puwLen, u8 *aubUdsData) {

    tUdsStatus eUdsStatus;
    u8 ubTableCfgIdx[UDS_SRV_CFG2_MAX] = { 0 }; // this leads to exception
    //...
}

NCS_PRI_FCT tUdsStatus UDS_RdbiManagement(u16 *puwLen, u8 *aubUdsData) {

    tUdsStatus eUdsStatus;
    u8 ubTableCfgIdx[UDS_SRV_CFG2_MAX]; // code works fine here
    // ...
}

【问题讨论】:

  • 您不能“使用 c99/c11 编译选项进行编译”。您可以在 C99 模式下构建,在 C11 模式下构建。你不能两者都做,它们是相互排斥的。
  • “整个缓冲区初始化”是什么意思?在 C (C89, C99, C11) 中没有部分初始化。对象要么未初始化,要么完全(所有工作字节)初始化。
  • 你在哪里得到异常?何时调用UDS_RdbiManagement?别的地方?您使用调试器来定位您的代码中发生崩溃的位置?
  • 我认为您的意思是“初始化导致不同的未定义行为(预期与意外)”
  • 您显示的代码中的任何内容都不会导致您描述的问题。见minimal, complete, and verifiable example

标签: c exception linker stack stack-memory


【解决方案1】:

感谢您的回答,问题实际上是堆栈对齐,这会导致异常,因为平台的堆栈对齐是 4 字节,20 字节缓冲区通过测试但 15 字节缓冲区由于错误的编译器对齐而失败并出现异常. 这已通过添加未对齐堆栈的编译选项并在硬件中激活正确的标志来解决。

纳比尔,

嵌入式/电子系统工程师。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2019-04-25
    • 2014-12-15
    相关资源
    最近更新 更多