SlideShare a Scribd company logo
1 of 36
Download to read offline
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 は忘れずにね。
・バイナリフォーマットにシンボルだけじゃなく
て関数のシグネチャ持たせれば、プロトタイプ宣
言いらないんじゃね?(戻り値のサイズの不一致と
かリンク時に検出できないかしら)
~素朴な疑問~

More Related Content

What's hot

俺と Ha4go と さくらクラウド
俺と Ha4go と さくらクラウド俺と Ha4go と さくらクラウド
俺と Ha4go と さくらクラウドMasayuki KaToH
 
コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達Azaika At
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope高広 内山
 
WEBページを表示するまで
WEBページを表示するまでWEBページを表示するまで
WEBページを表示するまでShoichi Kakizaki
 
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」Hiro H.
 
Rubyの実装をRubiniusで便利
Rubyの実装をRubiniusで便利Rubyの実装をRubiniusで便利
Rubyの実装をRubiniusで便利Yutaka Tachibana
 
Espressoじゃなくてcodaを使う理由
Espressoじゃなくてcodaを使う理由Espressoじゃなくてcodaを使う理由
Espressoじゃなくてcodaを使う理由Tao Sasaki
 
Ruby と C# をつなぐ
Ruby と C# をつなぐRuby と C# をつなぐ
Ruby と C# をつなぐ107steps
 
俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営Masayuki KaToH
 

What's hot (11)

俺と Ha4go と さくらクラウド
俺と Ha4go と さくらクラウド俺と Ha4go と さくらクラウド
俺と Ha4go と さくらクラウド
 
Js祭り
Js祭りJs祭り
Js祭り
 
コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達
 
Walking front end
Walking front endWalking front end
Walking front end
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope
 
WEBページを表示するまで
WEBページを表示するまでWEBページを表示するまで
WEBページを表示するまで
 
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
 
Rubyの実装をRubiniusで便利
Rubyの実装をRubiniusで便利Rubyの実装をRubiniusで便利
Rubyの実装をRubiniusで便利
 
Espressoじゃなくてcodaを使う理由
Espressoじゃなくてcodaを使う理由Espressoじゃなくてcodaを使う理由
Espressoじゃなくてcodaを使う理由
 
Ruby と C# をつなぐ
Ruby と C# をつなぐRuby と C# をつなぐ
Ruby と C# をつなぐ
 
俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営
 

Similar to No More Noprototype Function

Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行についてTomoya Kawanishi
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeKiwamu Okabe
 
プログラムの読み方
プログラムの読み方プログラムの読み方
プログラムの読み方Takuya Otani
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話simotin13 Miyazaki
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !Nobutada Matsubara
 
ffi for rubyists
ffi for rubyistsffi for rubyists
ffi for rubyistsnanki
 

Similar to No More Noprototype Function (9)

Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
 
プログラムの読み方
プログラムの読み方プログラムの読み方
プログラムの読み方
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !
 
ffi for rubyists
ffi for rubyistsffi for rubyists
ffi for rubyists
 

No More Noprototype Function