LoginSignup
1
1

More than 3 years have passed since last update.

C11 Annex. K を Mac で動かす

Last updated at Posted at 2019-10-14

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 が触れるようになった.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1