【问题标题】:Lint Warning: #647: Suspicious truncationLint 警告:#647:可疑截断
【发布时间】:2016-12-31 05:07:02
【问题描述】:

我已经阅读了关于可疑截断的这个 Lint 警告的相关问题,但这里是一个纯粹的 C 案例。

下面一行是Warning #647 弹出的地方:

pCont->sig -= (signed int64_t)((sub2 << 8)/pCont->freq + 1);

其中pCont-&gt;sig 也是 64 位有符号的(signed int64_t 类型),sub2freq 都是 32 位无符号的。这一切都是用armcc编译的。

已经尝试将1 转换为无符号32 位,但没有成功,但问题仍然存在。

知道我可以尝试什么,或者这里出了什么问题吗?

【问题讨论】:

  • 与您的问题无关,但int64_t已经定义为signed,使用时无需再次指定signed。参见例如this fixed-width integer reference.
  • 您需要:((int64_t)sub2 &lt;&lt; 8) / pCont-&gt;freq + 1?
  • 您必须自己回答的基本问题:“为什么要使用有符号类型来存储值,而它永远不会是负数?”并且“当表达式永远不能产生超过 32 个有效位时,为什么要将其存储为 63 位值?”想想“当 sub2 太大并且值溢出时会发生什么?”也不会有什么坏处?只有在你可以说“我本来打算那样做的!”之后你能抑制警告吗?

标签: c lint truncation armcc


【解决方案1】:

来自this reference about the warning

例如:

(long) (n << 8)

如果 n 是 unsigned int 则可能会引发此消息,而

(long) n << 8

不会。在第一种情况下,移位以 int 精度完成 高 8 位丢失,即使有 随后转换为可能包含所有位的类型。在 第二种情况,保留移位的位。

这似乎适合您的情况完全正确,并且还向您展示了如何解决它。

【讨论】:

  • lint 警告消失了!你的解释很明确。我很高兴;我的老板很高兴;我的 QA 同事很高兴 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2010-11-11
  • 2019-10-03
  • 2011-09-27
  • 2011-08-07
相关资源
最近更新 更多