Static Enforcement of Security with Types

Similar documents
Microsoft PowerPoint - RuntimeEnvII [Compatibility Mode]

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i

第一次段考 二年級社會領域試題 郭玉華 (A)(B) (C)(D)

(E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E) (A) (B) (C) (D) (E) (A) (B) (C) (D). ( ) ( ) ( ) ( ) ( ) ( ) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (

工 序 的 是 ( ) A. 卷 筒 切 筒 装 药 造 粒 B. 搬 运 造 粒 切 引 装 药 C. 造 粒 切 引 包 装 检 验 D. 切 引 包 装 检 验 运 输 7. 甲 公 司 将 其 实 施 工 项 目 发 包 给 乙 公 司, 乙 公 司 将 其 中 部 分 业 务 分 包 给

chap07.key

(A)3 4 (B)5 6 (C)7 9 (D)10 2 (E) (A) (B) (C) (D) (E) ( ) ( ) ( ) (A) (B) (C) (D) (E) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (

gcc 对整型和浮点型参数传递的汇编码生成特点分析 张昱 1. 相关资料 关于浮点数 (Floating-point) 的存储表示 : 浮点数的存储目前广泛采用 IEEE 754 标准 (1980 年 Intel 提出, 1985 年被 IEEE 采纳,

农银人寿发[2013]102号-4 农银寰宇至尊高端医疗保险条款

CC213

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Linux kernel exploit研究和探索

Microsoft PowerPoint - lec11 [兼容模式]

C/C++ - 函数

頁 次 :5-2 D 21. 關 於 定 型 化 契 約 之 敘 述, 何 者 是 錯 誤 的? (A) 通 常 由 企 業 經 營 者 單 方 預 先 擬 定 (B) 目 的 在 於 以 該 條 款 與 不 特 定 多 數 相 對 人 訂 約, 以 節 省 時 間 與 費 用 (C) 契 約 雙

頁 次 :6-2 (B) 19. 主 要 是 處 理 案 主 非 理 性 的 思 考 過 程 屬 於 那 一 種 諮 商 理 論 的 派 別? (A) 行 為 理 論 (B) 認 知 行 為 理 論 (C) 現 實 治 療 (D) 心 理 分 析 (C) 20. 一 位 結 婚 數 年 的 太 太

没有幻灯片标题

但 洋 糖 最 终 乘 船 溯 江 而 上, 再 加 上 民 国 初 年 至 抗 战 前 夕 二 十 余 年 间, 四 川 接 连 不 断 遭 受 水 灾 旱 灾 地 震, 平 均 每 月 爆 发 两 次 军 阀 混 战, 乡 村 遭 受 极 大 破 坏,( 赵 泉 民,2007) 农 村 经 济


.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident "GCC: (GNU) egcs /Linux (egcs release)" 修改图 6.5 中计算声明名字

Book1

碩命題橫式

Ctpu

1 CPU interrupt INT trap CPU exception

15XSSC.FIT)

第七期

C++ 程式設計

<4D F736F F D20A1BE A1BF C4EABDADCBD5D7CFBDF0C5A9B4E5C9CCD2B5D2F8D0D0B9C9B7DDD3D0CFDEB9ABCBBEB8FAD7D9C6C0BCB6B1A8B8E6A3A8B8FAD7D A3A9>

64 [ 46 ] (p297) 1924 :? [ 47 ] (p570) ; ; ; ; ; ; ; ; ; ; ; [ 11 ]; [ 35 ] [ 49 ] [ 32 ] ( ) [ 48 ] (p 425) [ 50 ] (p 670 6

ROP_bamboofox.key

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

主動學習快樂玩,韻文詩歌我在行

文 学 蓝 皮 书 迅 冯 俐 崔 涛 等 任 副 主 席, 徐 迅 任 秘 书 长 中 国 煤 矿 作 协 成 立 已 30 年, 1983 年 成 立 之 初 为 中 国 煤 矿 文 学 研 究 会, 1995 年 更 名 为 中 国 煤 矿 作 协 煤 炭 系 统 的 作 家 和 广 大 文

(Microsoft Word - 03\300\243\244p.doc)

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

bnb.PDF

. (A) (B) (C) A (D) (E). (A)(B)(C)(D)(E) A

栏目:前沿

网C试题(08上).doc

里 再 说 吓 唬 了 孩 子, 肯 定 方 宁 不 忍 所 以 她 不 死 便 罢, 倘 若 死, 只 有 到 办 公 室 沈 若 鱼 冷 静 得 好 像 在 评 点 某 一 电 视 剧 中 的 女 主 角 你 说 她 是 怎 么 死 的? 先 生 又 感 惊 骇 吃 安 眠 药 沈 若 鱼 成

我眼中的好老师

C/C++ - 文件IO

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

(Microsoft Word - \262\30440\266g-\253\312\255\261.doc)

北京大学学生会部员调查问卷结果

(➂)11. 炎 炎 夏 日, 即 使 下 起 滂 沱 大 雨, 都 消 除 不 了 令 人 心 煩 的 暑 氣 這 句 話 主 要 想 表 達 什 麼? ➀ 夏 日 裡 經 常 下 著 滂 沱 大 雨, 令 人 心 煩 ➁ 下 著 滂 沱 大 雨 的 日 子, 可 以 消 除 暑 氣 ➂ 夏 日

高雄市立五福國民中學九十四學年度第一學期第三次段考二年級本國語文學習領域試題卷

人 物 春 秋 杨 永 泰 将 其 削 藩 策 略 概 括 为 : 以 经 济 方 法 瓦 解 冯 玉 祥 的 第 二 集 团 军, 以 政 治 方 法 解 决 阎 锡 山 的 第 3 集 团 军, 以 军 事 方 法 解 决 李 宗 仁 的 第 四 集 团 军, 以 外 交 方 法 对 付 张 学

台北老爺校外實地參訪結案報告




Microsoft Word 養生與保健_中山大學_講義


萬里社區老人健康照護手冊

Microsoft Word - 強制汽車責任保險承保及理賠作業處理辦法 doc

Microsoft Word - 06.Understanding of Pregnancy and Birth.doc

範本檔

附 件 一 : 办 理 集 中 式 银 期 转 账 业 务 网 点 名 单 序 号 地 区 网 点 名 称 地 址 联 系 人 电 话 23 工 商 银 行 安 徽 省 铜 陵 百 大 支 行 铜 陵 市 长 江 东 路 50 号 鲁 桂 珍 工 商 银 行 安 徽

2. 二 年 級 吳 毓 秀 老 師 : 感 謝 午 餐 公 司 平 時 均 能 準 時 送 餐, 但 希 望 能 不 要 使 用 加 工 品, 且 學 生 反 映 希 望 能 多 加 蛋 品 的 食 物 3. 三 年 級 柯 阿 青 老 師 : 雞 肉 有 血 水 味, 請 午 餐 公 司 能 調

糖尿病食譜


,,,,,,, (,, ),,,,,,,,,,,,,,, ,,, 4 11,, ( ),,,, ( ), :, ( ),,, 1995, 66 ; ( ),, 1996, , 3-4,,

2002 4,,, 1941,,,,,,,,,,,,,,,,,, : ;:, 1991,

新・解きながら学ぶC言語

C 1

日期


序 1995 年 我 走 进 了 朝 阳 区 将 台 乡 五 保 老 人 院, 如 今 17 年 后, 十 分 欣 喜 有 机 会 为 这 本 流 金 岁 月 小 集 作 序 在 多 年 陪 伴 孤 单 老 人 的 过 程 中, 我 深 深 地 体 会 到 每 位 老 人 的 生 命 里 其 实 都

78 云 芝 79 五 加 皮 80 五 味 子 81 五 倍 子 82 化 橘 红 83 升 麻 84 天 山 雪 莲 85 天 仙 子 86 天 仙 藤 87 天 冬 88 天 花 粉 89 天 竺 黄 90 天 南 星 91 天 麻 92 天 然 冰 片 ( 右 旋 龙 脑 ) 93 天 葵

43081.indb


一 天 吃 两 顿, 从 不 例 外 我 上 班 就 是 找 一 个 网 吧 上 网 上 网 的 内 容 很 杂, 看 新 闻, 逛 论 坛, 或 者 打 打 小 游 戏 如 果 没 钱 上 网, 我 会 独 自 一 个 人 到 一 个 偏 僻 的 地 方, 静 静 地 坐 着 发 呆 这 也 是

工 造 价 15 邗 江 南 路 建 设 工 一 标 市 政 公 用 6000 中 机 环 建 集 团 有 限 公 胡 美 娟 16 邗 江 南 路 建 设 工 二 标 市 政 公 用 品 尊 国 际 花 园 1# 2# 3# 4# 7# 9# 10# 11# 楼 地 库 C 区 工

第一篇 建置区划


untitled


31 121

ǎà

大公借款企业资信评级报告框架

COSTA 盈 科 店 COSTA 欧 陆 广 场 店 COSTA 利 星 行 店 COSTA 国 瑞 店 COSTA 远 洋 光 华 店 COSTA 京 汇 店 COSTA 金 地 中 心 店 COSTA 棕 榈 泉 店 COSTA 中 海 广 场 店 COSTA 凤 凰 城 店 COSTA 都

Microsoft Word - n doc

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

新版 明解C言語入門編

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

. (B) (C) (D) (E). ( ) ( ) ( ) ( ) ( ) X Y (A) (B) (C) (D) (E) X Y X Y (A) (B) (C) (D) (E). (A) (B) (C) (D) (1) (2) (3). (A) (B) (C) (D) (E) (A) (B) (

老一輩的人常說”小孩就是該養得白白胖胖的才健康”,而且認為小時候胖沒關係,等長大身高一拉長,自然就不胖了

<4D F736F F D20C6C0BCB6B1A8B8E6B7E2C3E6A3A8E4AFD1F4CFD6B4FAA3A9>

c_cpp

C/C++语言 - C/C++数据

幻灯片 1

关 注 本 期 证 券 未 办 理 抵 押 权 转 让 变 更 登 记 本 期 证 券 发 起 机 构 转 让 信 托 财 产 时, 按 惯 例 并 未 办 理 抵 押 权 转 让 变 更 登 记, 而 由 委 托 人 在 有 管 辖 权 的 政 府 机 构 登 记 部 门 继 续 登 记 为 名

<4D F736F F D20C4CFCDA8B9FAD3D0D7CAB2FAB9ABCBBEB6A8B8E55F A3A8B5A3B1A3B7BDA3A E646F63>

<4D F736F F D20C6C0BCB6B1A8B8E6B7E2C3E6A3A8C8F0B0B2B9FACDB6B8FAD7D9A3A9>

<4D F736F F D20C6C0BCB6B1A8B8E6B7E2C3E6A3A8B8B7C4FEB3C7CDB6B8FAD7D9A3A9>

第3章.doc

untitled

<4D F736F F D20C9C2CEF7BDBBBDA C4EAB8FAD7D92DC8FDC9F32E646F63>

Transcription:

例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40;

static long aa = 10; func( ) { short bb = 20; 例题 1 static long cc = 30; short dd = 40; }.data.align 4.align 4.type cc.2,@object.type aa,@object.size cc.2,4.size aa,4 cc.2: aa:.long 30.long 10.text.globl bb.align 4.align 2.globl func.type bb,@object func:.size bb,2... bb: movw $40,-2(%ebp).value 20...

static long aa = 10; func( ) { short bb = 20; 例题 1 static long cc = 30; short dd = 40; }.data.align 4.align 4.type cc.2,@object.type aa,@object.size cc.2,4.size aa,4 cc.2: aa:.long 30.long 10.text.globl bb.align 4.align 2.globl func.type bb,@object func:.size bb,2... bb: movw $40,-2(%ebp).value 20...

static long aa = 10; func( ) { short bb = 20; 例题 1 static long cc = 30; short dd = 40; }.data.align 4.align 4.type cc.2,@object.type aa,@object.size cc.2,4.size aa,4 cc.2: aa:.long 30.long 10.text.globl bb.align 4.align 2.globl func.type bb,@object func:.size bb,2... bb: movw $40,-2(%ebp).value 20...

func(i) long i; { long j; j= i -1; func(j); } 例题 2

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j esp movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 ebp 变量 j 控制链 call func 函数调用低 addl $4,%esp 恢复栈顶指针返址栈 L1: 参数 i leave 即 mov ebp, esp; pop ebp.... 高 ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 call func 函数调用 addl $4,%esp 恢复栈顶指针 L1: esp leave 即 mov ebp, esp; pop ebp. ebp... ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 call func 函数调用 addl $4,%esp 恢复栈顶指针 esp L1: 参数 i leave 即 mov ebp, esp; pop ebp. ebp... ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 call func 函数调用 esp addl $4,%esp 恢复栈顶指针返址 L1: 参数 i leave 即 mov ebp, esp; pop ebp. ebp... ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 esp 控制链 call func 函数调用 addl $4,%esp 恢复栈顶指针返址 L1: 参数 i leave 即 mov ebp, esp; pop ebp. ebp... ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 esp call func 函数调用 ebp 控制链 addl $4,%esp 恢复栈顶指针返址 L1: 参数 i leave 即 mov ebp, esp; pop ebp.... ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j esp movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 ebp 变量 j 控制链 call func 函数调用低 addl $4,%esp 恢复栈顶指针返址栈 L1: 参数 i leave 即 mov ebp, esp; pop ebp.... 高 ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j esp movl -4(%ebp),%eax 低 高 ebp 栈 变量 j 控制链 返址 参数 i.... 调用序列之一调用序列之二 pushl %eax 把实参 j 的值压栈 call func 函数调用 addl $4,%esp 恢复栈顶指针 L1: leave 即 mov ebp, esp; pop ebp ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j esp movl -4(%ebp),%eax 低 高 ebp 栈 变量 j 控制链 返址 参数 i.... 返回序列之一返回序列之二 pushl %eax 把实参 j 的值压栈 call func 函数调用 addl $4,%esp 恢复栈顶指针 L1: leave 即 mov ebp, esp; pop ebp ret 即 pop eip( 下条指令地址 )

例题 2 返回序列之一 func(i) func: 返回序列之二 long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax esp ebp 控制链 返址 参数 i.... pushl %eax 把实参 j 的值压栈 call func 函数调用 addl $4,%esp 恢复栈顶指针 L1: leave 即 mov ebp, esp; pop ebp ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: 返回序列之一返回序列之二 long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 call func 函数调用 esp addl $4,%esp 恢复栈顶指针返址 L1: 参数 i leave 即 mov ebp, esp; pop ebp. ebp... ret 即 pop eip( 下条指令地址 )

例题 2 func(i) func: 返回序列之一返回序列之二 long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 call func 函数调用 addl $4,%esp 恢复栈顶指针 esp L1: 参数 i leave 即 mov ebp, esp; pop ebp. ebp... ret 即 pop eip( 下条指令地址 )

例题 2 返回序列之一 func(i) func: 返回序列之二 long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 call func 函数调用 esp ebp.... addl $4,%esp 恢复栈顶指针 L1: leave 即 mov ebp, esp; pop ebp ret 即 pop eip( 下条指令地址 )

例题 2 返回序列之一 func(i) func: 返回序列之二 long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp 修改基地址指针 long j; subl $4,%esp 为 j 分配空间 j= i -1; movl 8(%ebp),%edx 取 i 到寄存器 func(j); decl %edx i 1 } movl %edx,-4(%ebp) i 1 j movl -4(%ebp),%eax pushl %eax 把实参 j 的值压栈 call func 函数调用 esp ebp.... addl $4,%esp 恢复栈顶指针 L1: leave 即 mov ebp, esp; pop ebp ret 即 pop eip( 下条指令地址 )

例题 3 下面的程序运行时输出 3 个整数 试从运行环境和 printf 的实现来分析, 为什么此程序会有 3 个整数输出? main() { printf( %d, %d, %d\n ); }

main() { char *cp1, *cp2; 例题 4 cp1 = "12345"; cp2 = "abcdefghij"; strcpy(cp1,cp2); printf("cp1 = %s\ncp2 = %s\n", cp1, cp2); } 在某些系统上的运行结果是 : cp1 = abcdefghij cp2 = ghij 为什么 cp2 所指的串被修改了?

例题 4 因为常量串 12345 和 abcdefghij 连续分配在常数区执行前 : 1 2 3 4 5 \0 a b c d e f g h i j \0 cp1 cp2

例题 4 因为常量串 12345 和 abcdefghij 连续分配在常数区执行前 : 1 2 3 4 5 \0 a b c d e f g h i j \0 cp1 cp2 执行后 : a b c d e f g h i j \0 f g h i j \0 cp1 cp2

例题 4 因为常量串 12345 和 abcdefghij 连续分配在常数区执行前 : 1 2 3 4 5 \0 a b c d e f g h i j \0 cp1 cp2 执行后 : a b c d e f g h i j \0 f g h i j \0 cp1 cp2 现在的编译器大都把程序中的串常量单独存放在只读数据段中, 因此运行时会报错

例题 5 func(i,j,f,e) short i,j; float f,e; { short i1,j1; float f1,e1; printf(&i,&j,&f,&e); printf(&i1,&j1,&f1,&e1); } main() { short i,j; float f,e; func(i,j,f,e); } Address of i,j,f,e = 36, 42, 44, 54( 八进制数 ) Address of i1,j1,f1,e1 = 26, 24, 20, 14

例题 5 func(i,j,f,e) Sizes of short, int, long, float, short i,j; float f,e; double = 2, 4, 4, 4, 8 { ( 在 SPARC/SUN 工作站上 ) short i1,j1; float f1,e1; printf(&i,&j,&f,&e); printf(&i1,&j1,&f1,&e1); } main() { short i,j; float f,e; func(i,j,f,e); } Address of i,j,f,e = 36, 42, 44, 54( 八进制数 ) Address of i1,j1,f1,e1 = 26, 24, 20, 14

例题 5 func(i,j,f,e) Sizes of short, int, long, float, short i,j; float f,e; double = 2, 4, 4, 4, 8 { ( 在 SPARC/SUN 工作站上 ) short i1,j1; float f1,e1; printf(&i,&j,&f,&e); printf(&i1,&j1,&f1,&e1); } main() 为什么 4 个形式参数 i,j,f,e 的地址 { 间隔和它们类型的大小不一致 short i,j; float f,e; func(i,j,f,e); } Address of i,j,f,e = 36, 42, 44, 54( 八进制数 ) Address of i1,j1,f1,e1 = 26, 24, 20, 14

例题 5 当用传统的参数声明方式时, 编译器不检查实参和形参的个数和类型是否一致, 由程序员自己负责 但对形参和实参是不同的整型, 或不同的实型 - 编译器试图保证运行时能得到正确结果 - 条件是 : 若需数据类型转换时, 不出现溢出 编译器的做法 - 把整型或实型数据分别提升到 long 和 double 类型的数据, 再传递到被调用函数 - 被调用函数根据形参所声明的类型, 决定是否要将传来的实参向低级别类型转换

低地址放高位 例题 5 long short 长整型和短整型 double 高地址放低位 float 双精度型和浮点型

在 main 函数中参数压栈时的观点 例题 5 在 func 函数中存取形式参数时的观点 栈的增长方向 i,4 个字节 j,4 个字节 f,8 个字节 e,8 个字节 2 个字节, 起始地址 36 2 个字节, 起始地址 42 4 个字节, 起始地址 44 4 个字节, 起始地址 54 参数在栈中的情况

例题 6 下面程序为什么死循环 ( 在 SPARC/SUN 工作站上 )? main() { addr(); loop(); } long *p; loop() { long i,j; j=0; for(i=0;i<10;i++){ (*p)--; j++; } } addr() { long k; k=0; p=&k;}

例题 6 将 long *p 改成 short *p,long k 改成 short k 后, 循环体执行一次便停止, 为什么? main() { addr(); loop(); } short *p; loop() { long i,j; j=0; for(i=0;i<10;i++){ (*p)--; j++; } } addr() { short k; k=0; p=&k;}

例题 6 将 long *p 改成 short *p,long k 改成 short k 后, 循环体执行一次便停止, 为什么? main() { addr(); loop(); } short *p; loop() { long i,j; j=0; 低地址放高位 活动记录栈是从高向低方向增长 long i for(i=0;i<10;i++){ (*p)--; j++; } } addr() { short k; k=0; p=&k;} short k 高地址放低位

例题 7 main() { func(); printf("return from func\n"); } func() { char s[4]; strcpy(s,"12345678"); printf("%s\n",s); } 在 X86/Linux 操作系统上的运行结果如下 : 12345678 Return from func Segmentation fault (core dumped)

例题 7 main() { func(); printf("return from func\n"); } func() { char s[4]; strcpy(s,"12345678"); printf("%s\n",s); } esp ebp 低栈高 变量 s 控制链 返址......

例题 7 main() { func(); printf("return from func\n"); } esp func() { char s[4]; ebp strcpy(s,"123456789"); 低 printf("%s\n",s); 栈 } 高 123456789 Segmentation fault (core dumped) 变量 s 控制链 返址......

例题 8 int fact(i) main() int i; { { printf("%d\n", fact(5)); if(i==0) printf("%d\n", fact(5,10,15)); return 1; printf("%d\n", fact(5.0)); else printf("%d\n", fact()); return i*fact(i-1); } } 该程序在 X86/Linux 机器上的运行结果如下 : 120 120 1 Segmentation fault (core dumped)

例题 8 请解释下面问题 : 第二个 fact 调用 : 结果为什么没有受参数过多的影响? 第三个 fact 调用 : 为什么用浮点数 5.0 作为参数时结果变成 1? 第四个 fact 调用 : 为什么没有提供参数时会出现 Segmentation fault?

例题 8 请解释下面问题 : 第二个 fact 调用 : 结果为什么没有受参数过多的影响? 解答 : 参数表达式逆序计算并进栈,fact 能够取到第一个参数

例题 8 请解释下面问题 : 第三个 fact 调用 : 为什么用浮点数 5.0 作为参数时结果变成 1? 解答 : 参数 5.0 转换成双精度数进栈, 占 8 个字节它低地址的 4 个字节看成整数时正好是 0 esp ebp 低栈高 局部变量控制链 返址 参数...

例题 8 请解释下面问题 : 第四个 fact 调用 : 为什么没有提供参数时会出现 Segmentation fault? 解答 : 由于没有提供参数, 而 main 函数又无局部变量, fact 把老 ebp( 控制链 ) (main 的活动记录中保存的 ebp) 当成参数, 它一定是一个很大的整数, 使得活动记录栈溢出 esp ebp 低栈高 局部变量控制链 返址 控制链...