C11 Annex. K を Mac で動かす方法を調べてみる.
Motivation 的なもの
https://www.buildinsider.net/language/clang/02
このへんみつつ,gets_s とか動かしてみたい.
調査
適当にぐぐると,
https://teratail.com/questions/38504
最新の gcc であれば -std=c11 がとおるらしい.
$ gcc -std=c11 test.c
test.c:12:5: warning: implicit declaration of function 'printf_s' is invalid in C99 [-Wimplicit-function-declaration]
printf_s("test\n");
^
1 warning generated.
Undefined symbols for architecture x86_64:
"__gets_s_chk", referenced from:
_main in test-771537.o
"_printf_s", referenced from:
_main in test-771537.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
gcc は warning でるが,とおるようだ.が,肝心の libc ではねられる.
・・と思いきや,gcc 処理系ではそもそも gets_s は実装してないらしい.
gcc でははねないが,link しようとするとないからはねるとか地獄かよ.
・・・
うーん,ぐぐってもまともな実装がなさそうだが・・
https://stackoverflow.com/questions/57915149/using-c11-standard-with-clang-for-use-of-strcpy-s
https://stackoverflow.com/questions/47867130/stdc-lib-ext1-availability-in-gcc-and-clang/50921096#50921096
https://stackoverflow.com/questions/372980/do-you-use-the-tr-24731-safe-functions/373911#373911
以下に,C11 Secure Extension についてまとまっている.
https://github.com/rurban/safeclib/blob/master/doc/libc-overview.md
safeclib を compile して動かす
上記の記事は safeclib ライブラリの Github Repository のドキュメントの一部だった.これはタイトルどおり,C11 Annex. K 実装らしい.
safec libc extension with all C11 Annex K functions
https://github.com/rurban/safeclib
こいつをビルドして,直接 include して動かしてみることにする.
Github の Building あたりを眺めて入れようとすると,ローカルの Mac にライブラリが足りなかったので brew でいれる.
brew install automake libtool
Building まで.むやみに make install
で環境を汚すのは感心しない.
./build-aux/autogen.sh
./configure
make
実際に動くまで
build が通ると,以下のような状態になっている.
(抜粋)
$ tree safeclib
safeclib
├── Makefile
├── include
│ └── safe_lib.h
├── src
│ ├── .libs
│ │ ├── libsafec-3.5.a
他にもいろいろあるけど,上記が実体なので取り急ぎほかは気にしなくてよい.
試しにサンプルコード(test.c)を動かしてみる.
$ cat test.c
#include <stdio.h>
#include "./safeclib/include/safe_lib.h"
int main()
{
char buf[10];
char* ret;
ret = gets_s(buf, 10);
printf("out: %s\n", ret);
printf_s("test\n");
return 0;
}
適当にコンパイル.warning 出るかもだけど,safeclib でパスは通るから気にしない.
gcc safeclib/src/.libs/libsafec-3.5.a test.c
実行.9 文字以下を渡すとそれっぽく動く・・はず.
※ なぜか,8 文字以下じゃないとエラーになるが・・(調査中)
$ ./a.out
1234567
out: 1234567
test
ひとまずこれで Annex.K が触れるようになった.