Início
Conheça mais
Enviar pesquisa
Carregar
Entrar
Cadastre-se
Anúncio
No More Noprototype Function
Denunciar
simotin13 Miyazaki
Seguir
4 de Jul de 2016
•
0 gostou
0 gostaram
×
Seja o primeiro a gostar disto
mostrar mais
•
934 visualizações
visualizações
×
Vistos totais
0
No Slideshare
0
De incorporações
0
Número de incorporações
0
Check these out next
俺と Ha4go と さくらクラウド
Masayuki KaToH
Js祭り
Yoshihiko Hoshino
コードに潜むC++の未定義動作達
Azaika At
Walking front end
Hirata Tomoko
Rubinius Under a Microscope
高広 内山
WEBページを表示するまで
Shoichi Kakizaki
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
Hiro H.
Rubyの実装をRubiniusで便利
Yutaka Tachibana
1
de
36
Top clipped slide
No More Noprototype Function
4 de Jul de 2016
•
0 gostou
0 gostaram
×
Seja o primeiro a gostar disto
mostrar mais
•
934 visualizações
visualizações
×
Vistos totais
0
No Slideshare
0
De incorporações
0
Número de incorporações
0
Baixar agora
Baixar para ler offline
Denunciar
Software
C言語のプロトタイプ宣言が無いことの危険性についてアセンブラレベルで調べてみた内容を書きました。 C言語での新人教育等の際に使えるんじゃないかと思います。
simotin13 Miyazaki
Seguir
Anúncio
Anúncio
Anúncio
Recomendados
Rubyをちょっと理解しよう
Shun Hikita
1.3K visualizações
•
24 slides
Processingについて
reona396
1.4K visualizações
•
14 slides
Me and GitHub
Sanae Yamashita
755 visualizações
•
24 slides
p5.js について
reona396
1.9K visualizações
•
8 slides
Crystalで殺せ
Sachirou Inoue
508 visualizações
•
21 slides
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Shinichi Okada
917 visualizações
•
34 slides
Mais conteúdo relacionado
Apresentações para você
(11)
俺と Ha4go と さくらクラウド
Masayuki KaToH
•
774 visualizações
Js祭り
Yoshihiko Hoshino
•
3.7K visualizações
コードに潜むC++の未定義動作達
Azaika At
•
2.3K visualizações
Walking front end
Hirata Tomoko
•
2.3K visualizações
Rubinius Under a Microscope
高広 内山
•
1.6K visualizações
WEBページを表示するまで
Shoichi Kakizaki
•
9K visualizações
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
Hiro H.
•
1.8K visualizações
Rubyの実装をRubiniusで便利
Yutaka Tachibana
•
1.6K visualizações
Espressoじゃなくてcodaを使う理由
Tao Sasaki
•
815 visualizações
Ruby と C# をつなぐ
107steps
•
433 visualizações
俺 と 今年度 Civic Hack Night 運営
Masayuki KaToH
•
1K visualizações
Similar a No More Noprototype Function
(9)
Cプログラマのためのカッコつけないプログラミングの勧め
MITSUNARI Shigeo
•
5.8K visualizações
Ruby での外部コマンドの実行について
Tomoya Kawanishi
•
6.3K visualizações
第2回勉強会スライド
koturn 0;
•
3.9K visualizações
コマンドライン使いもLibreOffice
Kiwamu Okabe
•
3.2K visualizações
プログラムの読み方
Takuya Otani
•
147 visualizações
メタメタプログラミングRuby
emasaka
•
990 visualizações
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
•
408 visualizações
入門 超絶技巧プログラミング !
Nobutada Matsubara
•
467 visualizações
ffi for rubyists
nanki
•
20.1K visualizações
Anúncio
Último
(20)
留信网认证可查【新学院文凭证书毕业证购买】
hh123hh1
•
2 visualizações
留信网认证可查【威得恩大学文凭证书毕业证购买】
32lkhng
•
2 visualizações
☀️【波恩大学毕业证成绩单留学生首选】
bjd42as
•
2 visualizações
①【劳里埃大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 visualizações
測量支援ソフト「みとおしえ」「みとおしえクラウド」の紹介
ssuserbceee8
•
46 visualizações
測量データ処理ソフト・MarineDiscoveryの紹介
ssuserbceee8
•
26 visualizações
留信网认证可查【俄亥俄大学文凭证书毕业证购买】
1lkjhg
•
2 visualizações
①【伦敦政治经济学院毕业证文凭学位证书|工艺完美复刻】
0987hgh789
•
2 visualizações
留信网认证可查【伯明翰大学文凭证书毕业证购买】
32lkhng
•
2 visualizações
☀️【萨德伯里大学毕业证成绩单留学生首选】
15sad
•
2 visualizações
留信网认证可查【南安普顿大学文凭证书毕业证购买】
32lkhng
•
2 visualizações
①【密德萨斯大学毕业证文凭学位证书|工艺完美复刻】
0987hgh789
•
2 visualizações
国外学历【魁北克大学研究生文凭毕业证留学生首选】
ewq15a
•
2 visualizações
国外学历【奥克兰商学院研究生文凭毕业证留学生首选】
jsad789
•
2 visualizações
留信网认证可查【怀俄明大学文凭证书毕业证购买】
1lkjhg
•
2 visualizações
留信网认证可查【波恩大学文凭证书毕业证购买】
khh123kj
•
2 visualizações
①【卡毕兰诺大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 visualizações
在哪里可以做《俄克拉荷马大学文凭证书|毕业证》
lobd15
•
2 visualizações
留信网认证可查【艾格伍学院文凭证书毕业证购买】
32lkhng
•
2 visualizações
国外学历【麻省大学达特茅斯分校研究生文凭毕业证留学生首选】
534asdsa
•
3 visualizações
No More Noprototype Function
No More “No prototype
function” 2016/7/2 @simotin13
・@simotin13 Hiroyuki Miyazaki ・大阪で主に組み込みとかの仕事してます。 ・Rubyが好きです。 ・RubyでC言語のコンパイラ作ろうと思って勉強中です。 ・本日お集まりの皆様のお口に合うようなレベルの高い話ではないですが、大阪から来たので何か 爪痕を残して帰りたいと思います。どうか軽い気持ちで聞いてください。 自己紹介
サンプルコード
main.c #include <stdio.h> int main(int
argc, char **argv) { if (hoge() == 1) { // 無問題 printf(“One!!!¥n”); } else { // どうかしてるぜ!!! printf(“Not One!!!¥n”); } return 0; }
hoge.c unsigned char hoge(void)
{ return 1; }
ビルド $gcc main.c hoge.c
-Wall main.c: In function 'main': main.c:5:2: warning: implicit declaration of function 'hoge' [-Wimplicit-function-declaration] if (hoge() == 1) { ^ $
げげっ! ワーニング出てるやん。
なになに、 “implicit declaration” ・・・ う~ん・・
おぉ! hogeのプロトタイプ宣言忘れてたわ。
プロトタイプ宣言を追加 #include <stdio.h> // ★
↓プロトタイプ宣言追加 extern unsigned char hoge(void); int main(int argc, char **argv) { if (hoge() == 1) { // 無問題 printf(“One!¥n”); } else { // どうかしてるぜ!!! printf(“Not One!¥n”); } return 0; }
再度、ビルド $gcc main.c hoge.c
-Wall $
よしよし!問題ない。 動かしてみるか!
実行 $ ./a.out One!!!
「安心してください。 動きますよ!」
ここからが、本題。
「もしも新人プログラマーが ビルド時に 『-Wall』 をつけなかったら」
ビルド $gcc main.c hoge.c $
おぉ! 問題なくビルドできた! よかったよかった。
さて、動かしてみますか!
実行 $ ./a.out One!!!
「安心しないでください! 動かない可能性がありますよ。」
「でも動いてるじゃん」 だって!?
その証拠に・・・ これでもくらえ!
最適化ビルド $gcc main.c hoge.c
-Os $
実行 $ ./a.out Not One!!!
えぇ!? このコンパイラどうかしてるぜ!
最適化なし逆汗 08048630 <hoge>: 8048630: 55
push ebp 8048631: 89 e5 mov ebp,esp 8048633: b8 01 00 00 00 mov eax,0x1 8048638: 5d pop ebp 8048639: c3 ret
(サイズ)最適化あり逆汗 0804863c <hoge>: 804863c: 55
push ebp 804863d: b0 01 mov al,0x1 804863f: 89 e5 mov ebp,esp 8048641: 5d pop ebp 8048642: c3 ret
マシン語比較 0804863c <hoge>: 804863c: 55
push ebp 804863d: b0 01 mov al,0x1 804863f: 89 e5 mov ebp,esp 8048641: 5d pop ebp 8048642: c3 ret 08048630 <hoge>: 8048630: 55 push ebp 8048631: 89 e5 mov ebp,esp 8048633: b8 01 00 00 00 mov eax,0x1 8048638: 5d pop ebp 8048639: c3 ret 最適化なし サイズ最適化
おぉ! 確かに3バイトもサイズが小さく なってる
呼び出し側(main.c) ~ プロトタイプ宣言なし~ 080485fc <main>: 80485fc:
55 push ebp 80485fd: 89 e5 mov ebp,esp 80485ff: 83 e4 f0 and esp,0xfffffff0 8048602: 83 ec 10 sub esp,0x10 8048605: e8 26 00 00 00 call 8048630 <hoge> 804860a: 83 f8 01 cmp eax,0x1 804860d: 75 0e jne 804861d <main+0x21>
呼び出し側(main.c) ~ プロトタイプ宣言あり~ 080485fc <main>: 80485fc:
55 push ebp 80485fd: 89 e5 mov ebp,esp 80485ff: 83 e4 f0 and esp,0xfffffff0 8048602: 83 ec 10 sub esp,0x10 8048605: e8 25 00 00 00 call 804862f <hoge> 804860a: 3c 01 cmp al,0x1 804860c: 75 0e jne 804861c <main+0x20>
プロトタイプ宣言ありだと きっちりALレジスタで比較してる
・ 結論
No More ! “No
prototype function” ※-Wall は忘れずにね。
・バイナリフォーマットにシンボルだけじゃなく て関数のシグネチャ持たせれば、プロトタイプ宣 言いらないんじゃね?(戻り値のサイズの不一致と かリンク時に検出できないかしら) ~素朴な疑問~
Anúncio