29.11.2014 Views

MISRA-C-:2004 - 错误提示:发生了异常

MISRA-C-:2004 - 错误提示:发生了异常

MISRA-C-:2004 - 错误提示:发生了异常

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

以 导 致 函 数 所 运 行 的 环 境 状 态 的 改 变 。<br />

规 则 12.5( 强 制 ):<br />

逻 辑 && 或 | | 的 操 作 数 应 该 是 primary-expressions。<br />

“Primary expressions” 定 义 在 ISO 9899:1990 [2] 的 6.3.1 节 中 。 本 质 上 它 们 或 是 单 一 的 标<br />

识 符 , 或 是 常 量 , 或 是 括 号 括 起 来 的 表 达 式 。 本 规 则 的 作 用 是 要 求 , 如 果 操 作 数 不 是 单 一 的<br />

标 识 符 或 常 量 , 那 么 它 必 须 被 括 起 来 。 在 这 种 情 况 下 , 括 号 对 于 代 码 的 可 读 性 和 确 保 预 期 的<br />

行 为 都 是 非 常 重 要 的 。 如 果 表 达 式 只 由 逻 辑 && 序 列 组 成 或 逻 辑 | | 序 列 组 成 , 就 不 需 要 使<br />

用 括 号 。<br />

例 如 :<br />

if ( ( x == 0 ) && ishigh ) /* make x == 0 primary */<br />

if ( x || y || z ) /* exception allowed, if x, y and z are Boolean */<br />

if ( x || ( y && z ) ) /* make y && z primary */<br />

if ( x && ( !y ) ) /* make !y primary */<br />

if ( ( is_odd (y) ) && x ) /* make call primary */<br />

如 果 表 达 式 只 由 逻 辑 && 序 列 组 成 或 逻 辑 | | 序 列 组 成 , 就 不 需 要 使 用 括 号 。<br />

if ( ( x > c1 ) && ( y > c2 ) && ( z > c3 ) ) /* compliant */<br />

if ( ( x > c1 ) && ( y > c2 ) || (z > c3 ) ) /* not compliant */<br />

if ( ( x > c1 ) && ( ( y > c2 ) || ( z > c3 ) ) ) /* compliant extra ( ) used */<br />

注 意 , 本 规 则 是 规 则 12.1 的 特 例 。<br />

规 则 12.6( 建 议 ):<br />

逻 辑 运 算 符 (&&、| | 和 !) 的 操 作 数 应 该 是 有 效 的 布 尔 数 。 有 效 布 尔<br />

类 型 的 表 达 式 不 能 用 做 非 逻 辑 运 算 符 (&&、| | 和 !) 的 操 作 数<br />

[Koenig 48]<br />

逻 辑 运 算 符 &&、| | 和 ! 很 容 易 同 位 运 算 符 &、| 和 ~ 混 淆 。 见 术 语 表 中 的 “Boolean<br />

expressions”。<br />

规 则 12.7( 强 制 ): 位 运 算 符 不 能 用 于 基 本 类 型 (underlying type) 是 有 符 号 的 操 作 数 上 。<br />

[ 实 现 17-19]<br />

位 运 算 (~、、&、^ 和 | ) 对 有 符 号 整 数 通 常 是 无 意 义 的 。 比 如 , 如 果 右 移 运 算<br />

把 符 号 位 移 动 到 数 据 位 上 或 者 左 移 运 算 把 数 据 位 移 动 到 符 号 位 上 , 就 会 产 生 问 题 。<br />

基 本 类 型 的 描 述 见 6.10 节 。<br />

规 则 12.8( 强 制 ):<br />

移 位 运 算 符 的 右 手 操 作 数 应 该 位 于 零 和 某 数 之 间 , 这 个 数 要 小 于 左 手<br />

操 作 数 的 基 本 类 型 的 位 宽 。<br />

[ 未 定 义 32]<br />

例 如 , 如 果 左 移 或 右 移 运 算 的 左 手 操 作 数 是 16 位 整 型 , 那 么 要 确 保 它 移 动 的 位 数 位 于 0<br />

和 15 之 间 。<br />

基 本 类 型 的 描 述 见 节 6.10。<br />

有 多 种 确 保 遵 循 本 规 则 的 方 法 。 对 右 手 操 作 数 来 说 , 最 简 单 的 是 使 其 为 一 个 常 数 ( 其 值<br />

可 以 静 态 检 查 )。 使 用 无 符 号 整 型 可 以 保 证 该 操 作 数 非 负 , 那 么 只 有 其 上 限 需 要 检 查 ( 在 运 行<br />

时 动 态 检 查 或 者 通 过 代 码 复 查 )。 否 则 这 两 种 限 制 都 要 被 检 查 。<br />

u8a = (uint8_t) (u8a

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!