Submit Search
Upload
No More Noprototype Function
•
0 likes
•
981 views
simotin13 Miyazaki
Follow
C言語のプロトタイプ宣言が無いことの危険性についてアセンブラレベルで調べてみた内容を書きました。 C言語での新人教育等の際に使えるんじゃないかと思います。
Read less
Read more
Software
Report
Share
Report
Share
1 of 36
Download now
Download to read offline
Recommended
Rubyをちょっと理解しよう
Rubyをちょっと理解しよう
Shun Hikita
Processingについて
Processingについて
reona396
Me and GitHub
Me and GitHub
Sanae Yamashita
p5.js について
p5.js について
reona396
Crystalで殺せ
Crystalで殺せ
Sachirou Inoue
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Shinichi Okada
無名関数のすすめ
無名関数のすすめ
Shoichi Kakizaki
Harajuku.rb ( !rubykaigi in rubykaigi2011 )
Harajuku.rb ( !rubykaigi in rubykaigi2011 )
masaki yamada
Recommended
Rubyをちょっと理解しよう
Rubyをちょっと理解しよう
Shun Hikita
Processingについて
Processingについて
reona396
Me and GitHub
Me and GitHub
Sanae Yamashita
p5.js について
p5.js について
reona396
Crystalで殺せ
Crystalで殺せ
Sachirou Inoue
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Shinichi Okada
無名関数のすすめ
無名関数のすすめ
Shoichi Kakizaki
Harajuku.rb ( !rubykaigi in rubykaigi2011 )
Harajuku.rb ( !rubykaigi in rubykaigi2011 )
masaki yamada
俺と Ha4go と さくらクラウド
俺と Ha4go と さくらクラウド
Masayuki KaToH
Js祭り
Js祭り
Yoshihiko Hoshino
コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達
Azaika At
Walking front end
Walking front end
Hirata Tomoko
Rubinius Under a Microscope
Rubinius Under a Microscope
高広 内山
WEBページを表示するまで
WEBページを表示するまで
Shoichi Kakizaki
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
Hiro H.
Rubyの実装をRubiniusで便利
Rubyの実装をRubiniusで便利
Yutaka Tachibana
Espressoじゃなくてcodaを使う理由
Espressoじゃなくてcodaを使う理由
Tao Sasaki
Ruby と C# をつなぐ
Ruby と C# をつなぐ
107steps
俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営
Masayuki KaToH
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
MITSUNARI Shigeo
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行について
Tomoya Kawanishi
第2回勉強会スライド
第2回勉強会スライド
koturn 0;
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
Kiwamu Okabe
プログラムの読み方
プログラムの読み方
Takuya Otani
メタメタプログラミングRuby
メタメタプログラミングRuby
emasaka
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !
Nobutada Matsubara
ffi for rubyists
ffi for rubyists
nanki
More Related Content
What's hot
俺と Ha4go と さくらクラウド
俺と Ha4go と さくらクラウド
Masayuki KaToH
Js祭り
Js祭り
Yoshihiko Hoshino
コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達
Azaika At
Walking front end
Walking front end
Hirata Tomoko
Rubinius Under a Microscope
Rubinius Under a Microscope
高広 内山
WEBページを表示するまで
WEBページを表示するまで
Shoichi Kakizaki
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
Hiro H.
Rubyの実装をRubiniusで便利
Rubyの実装をRubiniusで便利
Yutaka Tachibana
Espressoじゃなくてcodaを使う理由
Espressoじゃなくてcodaを使う理由
Tao Sasaki
Ruby と C# をつなぐ
Ruby と C# をつなぐ
107steps
俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営
Masayuki KaToH
What's hot
(11)
俺と Ha4go と さくらクラウド
俺と Ha4go と さくらクラウド
Js祭り
Js祭り
コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達
Walking front end
Walking front end
Rubinius Under a Microscope
Rubinius Under a Microscope
WEBページを表示するまで
WEBページを表示するまで
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
Rubyの実装をRubiniusで便利
Rubyの実装をRubiniusで便利
Espressoじゃなくてcodaを使う理由
Espressoじゃなくてcodaを使う理由
Ruby と C# をつなぐ
Ruby と C# をつなぐ
俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営
Similar to No More Noprototype Function
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
MITSUNARI Shigeo
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行について
Tomoya Kawanishi
第2回勉強会スライド
第2回勉強会スライド
koturn 0;
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
Kiwamu Okabe
プログラムの読み方
プログラムの読み方
Takuya Otani
メタメタプログラミングRuby
メタメタプログラミングRuby
emasaka
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !
Nobutada Matsubara
ffi for rubyists
ffi for rubyists
nanki
Similar to No More Noprototype Function
(9)
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行について
第2回勉強会スライド
第2回勉強会スライド
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
プログラムの読み方
プログラムの読み方
メタメタプログラミングRuby
メタメタプログラミングRuby
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !
ffi for rubyists
ffi for rubyists
No More Noprototype Function
1.
No More “No prototype
function” 2016/7/2 @simotin13
2.
・@simotin13 Hiroyuki Miyazaki ・大阪で主に組み込みとかの仕事してます。 ・Rubyが好きです。 ・RubyでC言語のコンパイラ作ろうと思って勉強中です。 ・本日お集まりの皆様のお口に合うようなレベルの高い話ではないですが、大阪から来たので何か 爪痕を残して帰りたいと思います。どうか軽い気持ちで聞いてください。 自己紹介
3.
サンプルコード
4.
main.c #include <stdio.h> int main(int
argc, char **argv) { if (hoge() == 1) { // 無問題 printf(“One!!!¥n”); } else { // どうかしてるぜ!!! printf(“Not One!!!¥n”); } return 0; }
5.
hoge.c unsigned char hoge(void)
{ return 1; }
6.
ビルド $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) { ^ $
7.
げげっ! ワーニング出てるやん。
8.
なになに、 “implicit declaration” ・・・ う~ん・・
9.
おぉ! hogeのプロトタイプ宣言忘れてたわ。
10.
プロトタイプ宣言を追加 #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; }
11.
再度、ビルド $gcc main.c hoge.c
-Wall $
12.
よしよし!問題ない。 動かしてみるか!
13.
実行 $ ./a.out One!!!
14.
「安心してください。 動きますよ!」
15.
ここからが、本題。
16.
「もしも新人プログラマーが ビルド時に 『-Wall』 をつけなかったら」
17.
ビルド $gcc main.c hoge.c $
18.
おぉ! 問題なくビルドできた! よかったよかった。
19.
さて、動かしてみますか!
20.
実行 $ ./a.out One!!!
21.
「安心しないでください! 動かない可能性がありますよ。」
22.
「でも動いてるじゃん」 だって!?
23.
その証拠に・・・ これでもくらえ!
24.
最適化ビルド $gcc main.c hoge.c
-Os $
25.
実行 $ ./a.out Not One!!!
26.
えぇ!? このコンパイラどうかしてるぜ!
27.
最適化なし逆汗 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
28.
(サイズ)最適化あり逆汗 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
29.
マシン語比較 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 最適化なし サイズ最適化
30.
おぉ! 確かに3バイトもサイズが小さく なってる
31.
呼び出し側(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>
32.
呼び出し側(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>
33.
プロトタイプ宣言ありだと きっちりALレジスタで比較してる
34.
・ 結論
35.
No More ! “No
prototype function” ※-Wall は忘れずにね。
36.
・バイナリフォーマットにシンボルだけじゃなく て関数のシグネチャ持たせれば、プロトタイプ宣 言いらないんじゃね?(戻り値のサイズの不一致と かリンク時に検出できないかしら) ~素朴な疑問~
Download now