fork download
  1. // co_112_585.c
  2. // ##############################################################
  3. // ##
  4. // ## このプログラムはとっても危険かも知れません!!
  5. // ##
  6. // ## 実行中、PCにかなり負荷がかかった後
  7. // ## 勝手に電源が落ちるかも知れません(熱暴走?)
  8. // ## 実行される方は自己責任で。
  9. // ##
  10. // ##############################################################
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14.  
  15. int check(void);
  16. void make_code(int n);
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20. int min_if;
  21. int max_if;
  22. int n;
  23.  
  24. // 初期値 = 1 で開始し、2倍してコンパイルを試していく
  25. for (min_if = 1; min_if < 0x40000000; min_if *= 2) {
  26. fprintf(stderr, "testing %d", min_if);
  27. make_code(min_if);
  28. if (check()) { //error
  29. break;
  30. }
  31. fprintf(stderr, "... コンパイル成功\n");
  32. }
  33. if (min_if >= 0x40000000) {
  34. fprintf(stderr, "%dまで試したがコンパイル出来た\n", 0x20000000);
  35. fprintf(stderr, "(これ以上は当プログラムでは試せない)\n");
  36. return 0;
  37. }
  38. // 挟みうちでコンパイルを試していく
  39. max_if = min_if;
  40. min_if /= 2;
  41. while (1) {
  42. n = (max_if + min_if) / 2;
  43. fprintf(stderr, "testing %d", n);
  44. make_code(n);
  45. if (check()) { //error
  46. fprintf(stderr, "... コンパイル失敗\n");
  47. max_if = n;
  48. } else {
  49. fprintf(stderr, "... コンパイル成功\n");
  50. min_if = n;
  51. }
  52. if (max_if - min_if <= 1) {
  53. break;
  54. }
  55. }
  56.  
  57. // 結果
  58. printf("\n\n");
  59. printf("%d個までは大丈夫\n", min_if);
  60. printf("%d個でコンパイルエラー\n", max_if);
  61.  
  62. return 0;
  63. }
  64.  
  65. // if ~ else を n 個作成
  66. void make_code(int n)
  67. {
  68. FILE *fp;
  69. int i;
  70.  
  71. fp = fopen("test.c", "w");
  72. fprintf(fp, "int main(int argc, char *argv[])\n");
  73. fprintf(fp, "{\n");
  74. fprintf(fp, " switch(argc) {\n");
  75. fprintf(fp, " case 1:return 1;\n");
  76. for (i = 2; i <= n; i++) {
  77. fprintf(fp, " case %d:return %d;\n", i, i);
  78. }
  79. fprintf(fp, " default:break;\n");
  80. fprintf(fp, " }\n");
  81. fprintf(fp, " return 0;\n");
  82. fprintf(fp, "}\n");
  83. fclose(fp);
  84. }
  85.  
  86. // make_code(); で生成された test.c がコンパイル出来るかテスト
  87. int check(void)
  88. {
  89. int res;
  90. res = system("gcc -c -Wall test.c");
  91. if (res == 0) {
  92. remove("test.o");
  93. }
  94. return res;
  95. }
  96.  
  97. // End of co_112_585.c
  98.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty