29.11.2014 Views

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

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

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

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

做 为 能 产 生 错 误 的 例 子 , 考 虑<br />

x = b[i] + i++;<br />

根 据 b[i] 的 运 算 是 先 于 还 是 后 于 i ++ 的 运 算 , 表 达 式 会 产 生 不 同 的 结 果 。 把 增 值<br />

运 算 做 为 单 独 的 语 句 , 可 以 避 免 这 个 问 题 。 那 么 :<br />

• 函 数 参 数<br />

x = b[i] + i;<br />

i ++;<br />

函 数 参 数 的 运 算 次 序 是 未 指 定 的 。<br />

x = func ( i++, i);<br />

根 据 函 数 的 两 个 参 数 的 运 算 次 序 不 同 , 表 达 式 会 给 出 不 同 的 结 果 。<br />

• 函 数 指 针<br />

如 果 函 数 是 通 过 函 数 指 针 调 用 的 , 那 么 函 数 标 识 符 和 函 数 参 数 运 算 次 序 是 不 可 信 任<br />

的 。<br />

• 函 数 调 用<br />

p->task_start_fn (p++);<br />

函 数 在 被 调 用 时 可 以 具 有 附 加 的 作 用 ( 如 , 修 改 某 些 全 局 数 据 )。 可 以 通 过 在 使 用 函<br />

数 的 表 达 式 之 前 调 用 函 数 并 为 值 采 用 临 时 变 量 的 方 法 避 免 对 运 算 次 序 的 依 赖 。<br />

例 如<br />

x = f (a) + g (a);<br />

可 以 写 成<br />

x = f (a);<br />

x += g (a);<br />

做 为 可 以 产 生 错 误 的 例 子 , 考 虑 下 面 的 表 达 式 , 它 从 堆 栈 中 取 出 两 个 值 , 从 第 一 个<br />

值 中 减 去 第 二 个 值 , 再 把 结 果 放 回 栈 中 :<br />

push ( pop () – pop () );<br />

根 据 哪 一 个 pop () 函 数 先 进 行 计 算 ( 因 为 pop() 具 有 副 作 用 ) 会 产 生 不 同 的 结 果 。<br />

• 嵌 套 的 赋 值 语 句<br />

表 达 式 中 嵌 套 的 赋 值 可 以 产 生 附 加 的 副 作 用 。 不 给 这 种 能 导 致 对 运 算 次 序 的 依 赖 提<br />

供 任 何 机 会 的 最 好 做 法 是 , 不 要 在 表 达 式 中 嵌 套 赋 值 语 句 。<br />

例 如 , 下 面 的 做 法 是 不 赞 成 的 :<br />

x = y = y = z / 3;<br />

x = y = y++;<br />

• volatile 访 问<br />

类 型 限 定 符 volatile 是 C 提 供 的 , 用 来 表 示 那 些 其 值 可 以 独 立 于 程 序 的 运 行 而 自 由 更<br />

改 的 对 象 ( 例 如 输 入 寄 存 器 )。 对 带 有 volatile 限 定 类 型 的 对 象 的 访 问 可 能 改 变 它 的<br />

值 。C 编 译 器 不 会 优 化 对 volatile 的 读 取 , 而 且 , 据 C 程 序 所 关 心 的 , 对 volatile 的<br />

读 取 具 有 副 作 用 ( 改 变 volatile 的 值 )。<br />

做 为 表 达 式 的 一 部 分 通 常 需 要 访 问 volatile 数 据 , 这 意 味 着 对 运 算 次 序 的 依 赖 。 建 议<br />

对 volatile 的 访 问 尽 可 能 地 放 在 简 单 的 赋 值 语 句 中 , 如 :<br />

volatile uint16_t v;<br />

39

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

Saved successfully!

Ooh no, something went wrong!