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.

[参考译文] 编译器:在_I (0.0)格式数据中出现规则10.2 的Misra 2004警告

Guru**** 2535750 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/630870/compiler-misra-2004-warning-for-rule-10-2-in-_i-0-0-format-data

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

我在6.0 中选择了MISRA 2004,当我建立项目时,出现了太多的警告;

_IQ (0.0)格式数据不符合 MISRA规则10.2 的条件;

#define _iQ24 (a) (长)(((a)*1677.7216万.0L)

如何修改以传递MISRA规则10.2 ?

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

    在这种特定情况下,您不应收到MISRA警告。  在宏中,大常量为long double类型。  MISRA的诊断错误地抱怨它被隐式地转换为一种不太精确的类型。  这不会发生。  相反,宏参数A被隐式转换为long double,然后发生乘法,然后该乘法的结果被显式转换为long。  我在 SDOWP系统中提交了CodeGen-3794以对此进行调查。  欢迎您使用我签名中下面的SDOWP链接进行关注。

    我如何修改以传递MISRA规则10.2 ?[/QUOT]

    一种解决方法是使用长双参数调用宏...

    //常量上的L后缀表示类型为长双
    变量=_iQ24(1.234L);
    

    另一种解决方法是更改宏,使参数A的类型为long double ...

    #define _iQ24 (A)(长)((长双精度)(A)* 1677.7216万.0L)
    

    谢谢,此致,

    -George

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

    非常感谢!

    I修改过.#define _iQ24 (A)(长)((长双精度)(A)* 1677.7216万.0L)

    但在这种情况下,我得到一个MISRA警告MISRA 10.4 !

    float_t 变量;

    _IQ (可变);

    如何修改以传递MISRA规则10.4 ?

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

    我如何修改以传递MISRA规则10.4 ?[/QUOT]

    你不能。  下面是MISRA 10.4 的诊断...

    "file.c",第6行:警告:(Misra-C:2004 10.4 /R)复数的值
    浮点类型的表达式只能类型转换为浮点类型
    较窄或大小相同的
    返回(长)((长双)(arg)* 1677.7216万.0L);
    ^ 

    宏_iQ24有意将长双精度表达式更改为长。  这违反了MISRA 10.4。  当宏的参数是常量时,您就会放弃它。  在这种情况下,在出现任何MISRA检查之前,将整个表达式计算为长常量。  当宏的参数为变量时,不会进行编译时间计算。  然后,MISRA检查就会进行,这是一种违规行为。   

    我怀疑IQmath代码无法更改为构建MISRA Clean。

    谢谢,此致,

    -George