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.

[参考译文] 编译器:TI ARM CC MISRA 校验器与放大器;stdbool.h

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/926740/compiler-ti-arm-cc-misra-checker-stdbool-h

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

在 尝试将逻辑表达式的结果分配给 bool 时、如何使用 stdbool.h 类型并避免 MISRA 校验器错误? 以下情况将从与 MISRA 的第3条线弹出:

bool my_Bool = false;
my_Bool =! my_Bool;
my_Bool = true && false;
my_Bool =!(true && false); 

说明资源路径位置类型
#1393-D (MISRA-C:2004 10.1/R)整数类型表达式的值如果不转换为相同符号的更宽整数类型,则不应隐式转换为不同的基础类型. 第58行 C/C++问题

这是随 TI 编译器提供的 stdbool.h 中的内容、我想知道您如何使用布尔类型、因为类型似乎总是需要以位大小进行降频?

#include <_ti_config.h>

_TI_Proprietary pragma ("diag_push")
_TI_Proprietary pragma ("check_MISRA (\"-19.4\")")
_TI_Proprietary pragma ("check_MISRA (\"-19.11\")

")#ifndef __cplusplus

#definefalse0
#define true1

#define 1 #define _MISRA (\#-19.11\"")
_unsigned +#torite_tinature_bpragma



+#tinue_tine_tine_pragma +#if_bpragma!

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

    感谢您提交测试案例。  我可以重现相同的结果。  我找不到权变措施。  因此、我提交了条目 EXT_EP-9938以对此进行调查。  欢迎您使用我签名中的以下链接进行操作。

    谢谢、此致、

    乔治

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

    在 C 语言中、逻辑表达式的类型为"int";甚至"true"和"false"也只是"int"类型的整数常量宏。 测试用例将这些表达式分配给"bool "类型的对象、该对象只是_bool 类型的宏、正如您在头文件中看到的那样、该宏声明为"unsigned char"。 您可以通过将逻辑表达式转换为"unsigned char"、然后将其分配给"bool 变量来删除警告:

    my_Bool =(unsigned char)(true && false);
    my_Bool =(unsigned char)!!(true && false);

    奇怪的是、"bool 和"_Bool 都不能作为替代。 我怀疑这是 MISRA-C:2004检查中的缺陷、这对于 C99布尔类型自然没有特殊的情况。 也就是说、无论是强制转换还是不强制转换、I MISRA-C:2004在这里根本不应发出警告、我并不感到惊讶;这是否超出了 MISRA-C:2004的原始容量范围。

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

    [quote user="archaeology">ou 可以通过将逻辑表达式转换为"unsigned char"、然后将其分配给"bool 变量来删除警告:

    my_Bool =(unsigned char)(true && false);
    my_Bool =(unsigned char)!!(true && false);

    奇怪的是、"bool 和"_Bool 都不能作为替代。

    Yea 尝试了后一种方法、并调整了_Bool 定义;  感谢您提供了前 一种提示( 最好将其转换为 bool 的 typedef、但当您选择它时、它不起作用。)

    另请注意、从该标题中可以看到:

    #if __TI_Proprietary 严格_ANSI_MACRO && 199901L >__STDC_version__
    typedef unsigned char _Bool;
    #endif 

    typedef 适用于预 C99 、并启用了 TI 严格 ANSI。   true/false 只是插入字面量、 与 C 版本无关。

    这样做似乎是为了将 MISRA-2004与 bool 的特殊 typedef uchar 相混淆,但正如您指出 的那样,它是为 true 和 false 值而输入的。   要求始终减小位大小、使 MISRA 进行编码。

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

    很抱歉、您在 TI 的 MISRA-C:2004实施过程中遇到问题。  MISRA-C:2004用于处理符合标准的 C89程序。 虽然我们的实施将接受 C99程序、但它是针对符合标准的 C89程序、它只是对布尔类型没有专门的了解。

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

    >...my_Bool =(unsigned char)!!(true && false);

    尝试将建议的转换结果放在一个稍微复杂的语句上、使用变量而不是常量/字面量、然后该转换结果 不起作用、以删除警告。

    无论如何 、都是经过排序和清除的、我不应该使用2004检查器、我计划在其中使用 C99、并且 TI 的标头被分析的程度不是在 C99模式下。

    感谢您的关注。