├── example ├── exercises.c └── answer.s ├── proposal.md ├── LICENSE └── README.md /example/exercises.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main(void) { 3 | int a; 4 | int b; 5 | 6 | scanf("%d", &a); 7 | scanf("%d", &b); 8 | 9 | return a + b; 10 | } 11 | -------------------------------------------------------------------------------- /example/answer.s: -------------------------------------------------------------------------------- 1 | .intel_syntax noprefix 2 | .data 3 | .LC0: 4 | .string "%d" 5 | .text 6 | .globl main 7 | main: 8 | # prologue 9 | push rbp 10 | mov rbp, rsp 11 | sub rsp, 0x8 # allocate stack (sizeof(int) * 2) 12 | 13 | # call scanf 14 | lea rsi, [rbp - 0x4] # second argument &a 15 | lea rdi, .LC0[rip] # first argument "%d" 16 | mov rax, 2 # it's given two arguments 17 | 18 | push rbp 19 | mov rbp, rsp 20 | and rsp, -0x10 # stack alignment 21 | call scanf 22 | mov rsp, rbp 23 | pop rbp 24 | 25 | # call scanf 26 | lea rsi, [rbp - 0x8] # second argument &b 27 | lea rdi, .LC0[rip] # first argument "%d" 28 | mov rax, 2 # it's given two arguments 29 | 30 | push rax # stack alignment 31 | call scanf 32 | pop rax 33 | 34 | # a + b 35 | mov rax, [rbp - 0x4] # rax = a 36 | add rax, [rbp - 0x8] # rax += b 37 | 38 | # epilogue 39 | mov rsp, rbp 40 | pop rbp 41 | ret 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /proposal.md: -------------------------------------------------------------------------------- 1 | # 人間Cコンパイラコンテスト(Human C Compiler Contest / HCCC) 2 | 人間Cコンパイラコンテスト(HCCC)とは文字通り競技者自身がCコンパイラとなり 3 | C言語からアセンブリを生成し,その時間と正確さを競う競技です. 4 | 5 | 競技者にはコンパイラ技術の知識だけでなく 6 | C言語の仕様やアセンブリ,多くのアーキテクチャに関する知識が要求されます. 7 | 8 | ## 評価基準 9 | 以下をスコアとして算出し順位をつける. 10 | 11 | - 人力でコンパイルするまでの時間(提出までの時間) 12 | - 提出ファイルの大きさ 13 | - テストケースの正答率 14 | - テストケースの実行速度 15 | - コンパイルエラーの精度(与えられたコードが仕様として間違っているとき) 16 | 17 | ## 禁止事項 18 | - 既存のコンパイラを使用すること 19 | - コンパイラやツールを自作して使用すること 20 | - 他者と回答を共有すること 21 | - アセンブリ内に特定の回答を不正に埋め込む行為 22 | 23 | ## 競技の流れ 24 | 1. 作問者通知 25 | 1. 注意事項の連絡 26 | 1. C言語のソースコードを参加者に配布 27 | 1. 競技者がソースコードに応じてアセンブリを書いて提出 28 | 1. 提出されたアセンブリを実行ファイルにしてテストケースを走らせる 29 | 1. 結果発表 30 | 1. 講評 31 | 32 | ## 問題のレパートリーの例 33 | - ソースコードの正しさ(与えられたプログラムが間違っておりエラーを出す必要がある場合もある) 34 | - ソースコードの長さ 35 | - ソースコードの構文の複雑さ(構造体のアライメントや未定義動作など) 36 | - 複数のアーキテクチャ(x86\_64, arm, risc-v, ppc, mips) 37 | 38 | # Director 39 | 2021 11.21 40 | Takana Norimasa 41 | homepage: [https://alignof.github.io/](https://alignof.github.io/) 42 | github : [https://github.com/Alignof/](https://github.com/Alignof/) 43 | Twitter : [https://twitter.com/\_Alignof](https://twitter.com/_Alignof) 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Takana Norimasa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 人間Cコンパイラコンテスト(Human C Compiler Contest / HCCC) 2 | 人間Cコンパイラコンテスト(HCCC)とは文字通り競技者自身がCコンパイラとなり 3 | C言語からアセンブリを生成し,その時間と正確さを競う競技です. 4 | 与えられるソースコードの中にはコンパイルエラーを出す必要の 5 | ある仕様上間違ったものも含まれています. 6 | このような場合にはコンパイルエラーを出してアセンブリの生成を拒否する必要があります. 7 | 8 | つまり,競技者にはC言語の仕様の知識とアセンブリ,ABIの仕様の知識などの低レイヤの力が求められます. 9 | 逆に言えば,競技を通してこれらの力が付くとも言えます. 10 | 豊富なチュートリアルを用意する予定なので,これから低レイヤの領域に触れようという方も是非チャレンジしてほしいなと思います. 11 | 12 | ## お知らせ 13 | 第3回となる大会が9月30日に行われるSECCONのイベント,SECCONCONで開催します. 14 | 詳しくは以下のリンクをご覧ください. 15 | [https://www.seccon.jp/2023/seccon_contest/secconcon_1.html](https://www.seccon.jp/2023/seccon_contest/secconcon_1.html) 16 | 17 | ## チュートリアル 18 | [https://github.com/Alignof/HCCC_Tutorial](https://github.com/Alignof/HCCC_Tutorial) 19 | 20 | ## 競技規則 21 | 第3回大会では問題の掲載/提出を行う競技システムと手元でデバッグするための検証環境を用意して以下のような規則で実施する. 22 | 23 | ### A. 競技概要 24 | 1. 本コンテストは与えられたC言語のソースコードを決められた仕様に沿って解釈し対象となるアーキテクチャのアセンブリを出力する競技である. 25 | 1. 競技者は,与えられたソースコードが仕様上正しければ(コンパイル可能なら)アセンブリに変換し,ソースコードが仕様上正しくなければ(コンパイルエラーを出すべきなら), 26 | 変換を行わずにコンパイル不可であることと正しくないと思われる箇所の最初の行数を示す. 27 | 1. 第3回大会では以下の仕様を基準に競技を行う. 28 | 1. C言語の仕様はC99に則る[^C99]. 29 | 1. ABIの仕様はSystem V Application Binary Interfaceの仕様に従う[^ABI]. 30 | 1. 対象アーキテクチャはx86\_64とRISC-Vとする. 31 | 1. 記法はAT&Tとintel記法の双方を許可する. 32 | 1. アセンブラにはGNU assemblerを使用する[^GAS]. 33 | 1. 第3回大会では評価基準を以下のように定める. 34 | 1. 各問題に点数を与え,その得点で順位を決定する. 35 | 1. 得点が同じ場合は最後に正答した回答を提出した順番で順位づけを行う. 36 | 1. 誤答した場合はその問題でACしたことにより得た得点から誤答の数に応じて減点する(誤答1回に対して1点減点).減点はACした問題にのみ適用される(マイナスの得点にはならない). 37 | 1. 誤答のうちコンパイルできるはずのものにコンパイルエラーを出した場合(WCとなった場合),以後は提出が不可能となる. 38 | 39 | ### B. 競技システム 40 | 1. 回答が正しいかどうかはジャッジシステムで行う.ジャッジシステムはテストケースを与えて判定を行ったり問題につけられた制約を確認したりする. 41 | 1. ジャッジシステムは以下のいずれかの結果を返す. 42 | - AC(**Ac**cepted): 正答. 43 | - WA(**W**rong **A**nswer): テストケースの出力が正しくない. 44 | - WC(**W**rong **C**ompile error): 本来正しいプログラムにコンパイルエラーを出した. 45 | - AE(**A**ssembler **E**rror): アセンブラのエラー. 46 | - LE(**L**inker **E**rror): リンカのエラー. 47 | - RE(**R**untime **E**rror): 実行時のエラー. 48 | - TLE(**T**ime **L**imit **E**xceeded): 実行制限時間オーバー. 49 | - Pending: ジャッジ待ち. 50 | - SystemError: 上記以外のエラー.運営によるリジャッジが行われる可能性がある. 51 | 1. ジャッジシステムはAE, LE, REなどの場合に各エラーを競技者に表示する. 52 | 1. 実行の制限時間は2000msとする. 53 | 1. ジャッジは以下の環境で行われる. 54 | ``` 55 | $ uname -a 56 | Linux 31d57f0f4274 6.5.4-arch2-1 #1 SMP PREEMPT_DYNAMIC Thu, 21 Sep 2023 11:06:39 +0000 x86\_64 GNU/Linux 57 | $ lld --version 58 | Debian GLIBC 2.31-13+deb11u6 59 | $ gcc --version 60 | gcc (GCC) 12.2.0 61 | $ as --version 62 | GNU assembler (GNU Binutils for Debian) 2.35.2 63 | $ ld --version 64 | GNU ld (GNU Binutils for Debian) 2.35.2 65 | ``` 66 | 67 | [^C99]:[https://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf](https://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf) 68 | [^ABI]:[https://uclibc.org/docs/psABI-x86_64.pdf](https://uclibc.org/docs/psABI-x86_64.pdf) 69 | [^GAS]:NASM使いのひとごめんなさい. 70 | 71 | ### C. 許可事項 72 | 競技者は特に以下のことを許可される. 73 | 1. 紙,鉛筆,電卓などを用いること. 74 | 1. 指定された仕様書の閲覧. 75 | 1. 指定された検証環境を使ってローカルでデバッグを行う. 76 | 1. 検証環境内での生成した実行ファイルに対するgdbの使用. 77 | 1. 人間による恣意的な最適化[^1]. 78 | 79 | [^1]: 一部の問題では明示的に許可されない場合がある. 80 | 81 | ### D. 禁止事項 82 | 競技者は特に以下のことを禁止される. 83 | 1. 既存のコンパイラを使用すること. 84 | 1. その他既存のツールを使用すること. 85 | 1. コンパイラやツールを自作して使用すること. 86 | 1. 他者と回答を共有すること. 87 | 1. 回答にジャッジサーバを攻撃するような処理を埋め込むこと. 88 | 89 | ## 当日の流れ 90 | 1. 競技サーバへの登録と検証環境の配布 91 | 1. 注意事項の連絡 92 | 1. 競技開始 93 | 1. 競技 94 | 1. 競技終了 95 | 1. 結果発表 96 | 1. 解説 97 | 98 | ## Director 99 | 2022 11.16 100 | Norimasa TAKANA 101 | github: [https://github.com/Alignof/](https://github.com/Alignof/) 102 | Twitter: [https://twitter.com/\_Alignof](https://twitter.com/_Alignof) 103 | --------------------------------------------------------------------------------