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.

[参考译文] 编译器/TMS320C6670:使用未初始化的变量时没有警告

Guru**** 2614265 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/648377/compiler-tms320c6670-no-warning-on-using-uninitialized-variable

器件型号:TMS320C6670

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

您好!

使用 Visual Studio 交叉编译代码段我注意到有关使用未初始化变量的警告、C6000编译器未报告该警告。 我已经注意到、它在更大的块中掩盖了错误、但它可以简化为类似的东西

float sample (short *x)
{
浮点和、a = 0.5、y、b;
int i、cnt = 100;

对于(i = 0;i < cnt;i++)
{
如果(b < 5) a += x[i]+3.0/4;
其他 a = x[i]+3.0/4;
总和+= a;
}
y =总和/(浮点)(cnt);
返回 y;
} 

编译器不会注意到在使用之前未初始化'sum'。

完整的命令行为

调用:C6000编译器
的"D:/TI/ccsv7/tools/compiler/c6000_7.4.23/bin/cl6x /TI/pdk_C6670_1_1_2_6/packages/ti/drv/pcie /TI/pdk_C6670_1_1_2_6/packages/ti/platform - mv6600 --abi=eabi -O3 -g - include_path="D:/TI/ccsv7/tools/compiler/c6000_7.4.23/include /TI/pdk_C6670_1_1_2_6/packages/ti/drv/cppi /TI/pdk_C6670_1_1_2_6/packages/ti/drv/fftc - include_path="D:/TI/pdk_C6670_1_1_2_6/packages/ti/csl - include_path="D:/TI/pdk_C6670_1_1_2_6/packages/ti/drv/qmss /TI/dsplib_c66x_3_4_0_0 - include_prefrom_path="D:opt_define_remote_display_romage=-refrom_be_display_bromage=-refrom_tr_b_-refrom_b_-refrom_-ref_b_b_b_-refromage_-ref_b_b_b_-refug_be_be_brom_b_-tr_b_-ref_-ref_brom_b_b_-rom_b_-ref_b_-ref_b_-ref_b_b_b_b_-refug_b_-_brom_b_-_-_-ref_b_-ref_brom_b_-_-_-ref_b_-ref_brom_b_-ref_b_-_b_b_-ref_b_-_brom_b_- 

有趣的是、如果在循环中注释掉'if'语句、编译器会识别空循环并将其删除、但仍然看不到未初始化的'sum'。 仅当对于已删除的循环编译器报告 sum 问题时。

float sample (short *x)
{
浮点和、a = 0.5、y;
int i、cnt = 100;

对于(i = 0;i < cnt;i++)
{
总和+= a;
}
y =总和/(浮点)(cnt);
返回 y;
} 

我想从编译器专家那里了解一下、这不是一个错误吗?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是一个错误。
    否、编译器没有义务捕获它。
    回到黑暗时代、这就是需要 Lint 的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="rlagic"]我想听听编译器专家的意见,这不是一个错误吗?

    不、这不是一个错误。  C 和 C++标准文档几乎完全没有提到诊断。  需要诊断和他们应该说什么等内容留给每个编译器实现。   

    TI 编译器无法查看变量在使用前未初始化的这个特定实例。   

    有许多专门用于此目的的工具。  我建议您在 静态分析工具一词上执行搜索

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我指的是用户程序中的错误、而不是编译器中的错误!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TI 编译器无法查看变量在使用前未初始化的特定实例。   

    假设 TI 编译器支持 MISRA-C:2004检查我启用了对规则9.1的检查"所有自动变量在使用前都应已分配值"、并且使用示例代码、TI C6000 v8.2.2编译器未报告警告。

    此代码是否在 MISRA-C:2004规则9.1检查中显示了限制?

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

    Keith、George、

    感谢您的澄清。 不知怎么说、我觉得编译器会尝试诊断这样的情况、因此被问及的情况不是编译器的缺陷。 现在、我知道编译器没有严格的义务来执行该操作、即使有人看到这样的警告、也不应在代码的其余部分依赖它。 我对这种解释很满意、并且将在解决后关闭该线程。 但是切斯特,你真的抓住了游戏的机会:-)我自己试过,确认 MISRA-C:2004规则9.1也没有通过7.4.23来捕获错误。

    相反、它会在类似的情况下产生大量光化

    (笑声)
    RET_TYPE RET_var;
    ...
    sent_function (参数、...、&ret_var); 

    这在技术上是正确的、但实际上取决于函数的大小。 我是否可以要求对 www.misra.org.uk/.../viewtopic.php 中9.1项的澄清作出评论

    谢谢你。

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

    文件 misra.txt 是编译器安装的一部分。  它出现在根目录中。  此文件包含有关检查各种 MISRA 规则的详细信息。  它讨论的是第9.1条的一个限制,但不是这个特定的限制。  我在 SDOWP 系统中提交了 CodeGen-4089、以更改规则9.1中的 misra.txt 条目。  它还将讨论无法检测到违反规则的情况、例如此主题中的情况。  欢迎您通过我签名中的下面 SDOWP 链接来跟踪此缺陷。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    乔治
    感谢您的努力。 虽然我无法在那里跟踪 CodeGen-4089、但我相信稍后会进行必要的澄清。 也许我们花了太多的时间讨论了没有义务执行的作业编译器。
    再次感谢。