トップ «前の日記(2016-04-24(Sun)) 最新 次の日記(2016-04-26(Tue))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2016-04-25(Mon) 晴れてるが

cc -Weverything

$ 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や内容が変った場合はあしからず。

index.htmlは ここから。