僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
$ cc -Weverything -o rec3 rec3.c rec3.c:6:5: warning: no previous prototype for function 'rec' [-Wmissing-prototypes] int rec(int n){ ^ rec3.c:15:7: warning: unused variable 'foo' [-Wunused-variable] int foo = argc; ^ 2 warnings generated.
前のが警告を吐いた(プロトタイプ宣言の引数および型のないことと int argcが使われていないこと)ので修正。
#include<stdio.h> #include<stdlib.h> int rec(int n); int rec(int n){ if (n == 0) return 0; else return 1 + rec(n - 1); } int main(int argc , char **argv) { if (argc < 2) { printf("No option!\n"); exit(1); } int rec_num = atoi(argv[1]); printf("%d\n", rec(rec_num)); return 0; }
同様に簡略版も訂正。
$ cc -Weverything -o rec4 rec4.c rec4.c:4:17: error: function definition is not allowed here int rec(int n){ ^ 1 error generated.
#include<stdio.h> int rec(int n); int rec(int n) { if (n == 0) return 0; else return 1 + rec(n - 1); } int main() { printf("%d\n", rec(261900)); return 0; }
gcc4.9.2 と gcc5.3.1でも警告は何も出ないことを確認。
「時々」セグメント違反を追っかけてみた。
今のところLinux以外では再現しないようだ。
$ uname -a Linux HOST 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) i686 GNU/Linux $ gcc --version gcc (Debian 4.9.2-10) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ for x in `seq 100` ; do ./rec4 ; done|grep -c 26 66
i686なDebian Jessie でも、 コンパイラをclangに変えても同様に「時々」。
$ clang-3.5 --version Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0) Target: i386-pc-linux-gnu Thread model: posix $ uname -a Linux HOST 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) i686 GNU/Linux $ clang-3.5 -Weverything -o rec3a rec3a.c $ for x in `seq 100`; do ./rec3a 261900; done | grep -c 261 65
ARMでは再現しなかったが、PowerPCでは再現。
$ uname -a Linux PPCHOST 3.16.0-4-powerpc #1 Debian 3.16.7-ckt25-1 (2016-03-06) ppc GNU/Linux $ gcc --version gcc (Debian 4.9.2-10) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ cat /proc/cpuinfo processor : 0 cpu : 7450, altivec supported clock : 733.333331MHz revision : 2.0 (pvr 8000 0200) bogomips : 66.43 timebase : 33217850 platform : PowerMac model : PowerMac3,5 machine : PowerMac3,5 motherboard : PowerMac3,5 MacRISC2 MacRISC Power Macintosh detected as : 69 (PowerMac G4 Silver) pmac flags : 00000010 L2 cache : 256K unified pmac-generation : NewWorld Memory : 384 MB $ for x in `seq 100`; do ./rec3a 262000; done | grep -c 26 51
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。