【C言語】完全なオブジェクト指向ではなく、Interfaceのみを利用する選択【Golangを参考に】

【C言語】完全なオブジェクト指向ではなく、Interfaceのみを利用する選択【Golangを参考に】

C言語とオブジェクト指向は相性悪い オブジェクト指向は、C言語でも実現できます。 C言語は、言語によるオブジェクト指向プログラミングのサポートがありません。しかし、開発者が注意深く実装する事によって、オブジェクト指向プログラミングが可能です。 ...

November 17, 2021 · 5 min
【C言語】_Generic(C11、gcc4.6以降)または__attribute__((overloadable))によるオーバーロード

【C言語】_Generic(C11、gcc4.6以降)または__attribute__((overloadable))によるオーバーロード

前書き C言語にはオーバーロードがない。そんな風に考えていた時期が私にもありました。 オーバーロードとは、メソッド(関数)を多重定義する言語仕様です。例えば、Javaでは引数の順番もしくは引数の個数を変える事によって同名メソッドを複数定義できます。 ...

May 15, 2021 · 4 min
【コーディングルール】C言語ライブラリのAPIを実装する際に注意すべき事柄

【コーディングルール】C言語ライブラリのAPIを実装する際に注意すべき事柄

前書き:未だにC言語で消耗中 2020年現在、C言語ライブラリをフルスクラッチで開発する機会はほぼ無いと思われますが、歴史のある企業に勤めている方は内製ライブラリ(秘伝のタレ)を修正/機能追加する機会があるのではないでしょうか。 ...

December 19, 2020 · 7 min
【静的解析】ソースコード解析補助ツールSourcetrailの導入方法【例:systemd(C言語)】

【静的解析】ソースコード解析補助ツールSourcetrailの導入方法【例:systemd(C言語)】

前書き:Sourcetrailとは Sourcetrailは、C/C++/Java/Pythonで書かれたコードを解析し、クラス(構造体)やメソッドの依存関係/呼び出し関係を可視化してくれるツールです。 以下の特徴を持つため、会社での業務利用でも気軽にSourcetrailを使用可能です。 Windows/Mac/Linuxで動作 ライセンスはGPL v3(使用は自由ですが、Sourcetrail自体の改変や販売はソースコード公開義務が発生) オフラインで動作(DBを作成しますが、外部サーバにアップロードしません) 使用例を下図に示します。 ...

December 12, 2020 · 9 min
【苦行】C言語で正規表現を用いる方法【標準Cライブラリ(glibc)使用】

【苦行】C言語で正規表現を用いる方法【標準Cライブラリ(glibc)使用】

 前書き:C言語で正規表現を使う理由などない 正規表現(Regular Expression)は強力な機能なため、様々なLinuxコマンドやプログラミング言語、アプリに導入されています。特に、sed/awk/egrepコマンドやPerl/Rubyは、正規表現による文字列操作の代名詞のような存在です。 ...

November 1, 2020 · 18 min
Debian(64bit)で32bitバイナリを実行もしくは作成する方法(C言語)

Debian(64bit)で32bitバイナリを実行もしくは作成する方法(C言語)

検証環境 Debian10(64Bit)、Ryzen 7 3800X環境で検証します。CPUアーキテクチャはIntel/AMDを想定しており、ARMに関しては本記事で説明しません。 ...

August 19, 2020 · 3 min
起動済みプロセス(例:デーモンプロセス)の標準出力を確認する方法

起動済みプロセス(例:デーモンプロセス)の標準出力を確認する方法

前書き:ログを残さないデーモンと出会った DBにアクセスするデーモンプロセスが、稀にSegmentation Faultでお亡くなりになる現象に遭遇しました。 このデーモンプロセスは、C言語で書かれており、デバッグ情報をログファイルに殆ど出力していませんでした。多くの情報は標準出力に出力されていたため、デバッグするにはデーモンプロセスの標準出力を確認する必要がありました(もしくは、GDBを使う)。 ...

July 4, 2020 · 2 min
【C言語】static(private)関数をユニットテストする3つの方法【単体テストのバッドノウハウ】

【C言語】static(private)関数をユニットテストする3つの方法【単体テストのバッドノウハウ】

前書き:C言語のstatic関数は単体テストできます C言語で単体テストを作成する際に、**「どうやってstatic関数をテストコードから呼び出せばいいのか?」**と迷った事はありませんか?例えば、以下のコードのprivate_func()を他のCソースファイル(例:テストコード)から呼び出せるでしょうか。 ...

April 26, 2020 · 4 min
C言語で非推奨なC標準関数(例:strcpy)をコンパイルエラーにする方法

C言語で非推奨なC標準関数(例:strcpy)をコンパイルエラーにする方法

前書き C言語は歴史の長い言語のため、非推奨関数があります。例えば、strcpy()は文字列をコピーする際にサイズチェックをしないため、バッファオーバーフローを引き起こす可能性があります。そのため、一般的には、strcpy()の代替関数としてstrcpy_s()を使用する事が推奨されています。 ...

September 7, 2019 · 4 min
Linux Kernel: mutex APIによるロック(排他)方法

Linux Kernel: mutex APIによるロック(排他)方法

前書き:mutexとは Linux Kernelに限らず、様々なプログラミング言語やライブラリはロック機構を提供しています。ロック機構は、複数のプロセスが同時に共有データを書き換え、意図しないデータ状態となる事を防ぎます。代表的なロック機構には、 ...

July 7, 2019 · 8 min
Linux Kernelの簡単なCharacter Deviceを作成する方法(Linked List APIの使用方法サンプル)

Linux Kernelの簡単なCharacter Deviceを作成する方法(Linked List APIの使用方法サンプル)

前書き 本記事では、Linux KernelにおけるCharacter Device向けのDevice Driverを作成する方法を示します。専用のHardware(例:シリアルデバイスのUARTなど)を用いず、メモリ上のデータ読み書きのみを行います。そのため、擬似デバイス(/dev/nullや/dev/zeroなど)を操作するDriverと同等です。 ...

June 23, 2019 · 13 min
Linux Kernel: __initマクロ、__exitマクロの役割(メモリの有効利用)

Linux Kernel: __initマクロ、__exitマクロの役割(メモリの有効利用)

__initマクロ、__exitマクロが使われるケース 一般的に、__initマクロはKernelモジュールの初期化時、__exitマクロはKernelモジュールの終了時に付与します。以下の例では、初期化関数がdebimate_init()、終了関数がdebimate_exit()で、それぞれにマクロを付与しています。 ...

April 29, 2019 · 4 min
Linux Kernel: List構造を操作するためのAPI(Listの使い方)

Linux Kernel: List構造を操作するためのAPI(Listの使い方)

前書き C言語は、言語としてList構造およびList操作APIをサポートしていません。ここでのList構造とは、「次のデータ(前のデータ)へのポインタ」を意味します。本記事では、データとList構造(nextポインタ、prevポインタ)をセットにした状態をノードと呼びます。 ...

April 7, 2019 · 13 min
Linux Kernel: 構造体メンバポインタから構造体の先頭ポインタを得るcontainer_ofマクロ

Linux Kernel: 構造体メンバポインタから構造体の先頭ポインタを得るcontainer_ofマクロ

container_ofマクロとは container_ofマクロは、Linux Kernelで用いられ、「構造体メンバポインタ」から「そのメンバを含む構造体の先頭ポインタ」を得られるマクロです。C言語では、offsetofマクロによって構造体メンバアドレスのオフセット(構造体先頭アドレスからメンバ変数までのオフセット)を算出できます。container_ofマクロは、このオフセットを利用し、構造体の先頭アドレスを算出しています。 ...

April 6, 2019 · 5 min
Linux Kernel: NULLポインタエラーハンドリング(ERR_PTR, IS_ERR, PTR_ERR)

Linux Kernel: NULLポインタエラーハンドリング(ERR_PTR, IS_ERR, PTR_ERR)

“返り値がNULL” = “情報量がない” C言語には、返り値としてポインタを返す関数があります。 User空間の関数で例を挙げれば、メモリを確保するmalloc()、ファイルを開くfopen()などです。これらの関数は、エラー時にNULLを返します。 ...

March 2, 2019 · 6 min
Linux Kernel: エラー番号の一覧

Linux Kernel: エラー番号の一覧

前書き 本記事では、Linux Kernelが用いるエラー番号を説明します。 Linux Kernelがエラー番号(errno)を正しく返す意義 Linux Kernelでは、エラーの種類に応じて、返すべきエラー番号が定められています。例えば、ファイルが存在しない場合は、“ENOENT(No such file or directory、 エラー番号2)“を返します。Linux Kernel内のエラー内容は、変数errnoを通してUser空間にも伝わります。 ...

February 24, 2019 · 10 min
Linux Kernel: prink(print kernel)によるメッセージ出力

Linux Kernel: prink(print kernel)によるメッセージ出力

printk()とは printk(print kernel)は、ユーザ空間のprintf( print formatted )に相当します。注意すべき点として、printf()と以下の点が異なります。本記事では、この差異を説明します。 ...

February 2, 2019 · 6 min
環境構築: Linux Kernelモジュールの作成準備

環境構築: Linux Kernelモジュールの作成準備

前書き 本記事は、「Linux Kernel Device Driverの雛形作成」や「Linux Kernel内APIを試すためのモジュール作成」を目的として、最低限必要な環境構築手順を記載しています。 ...

January 27, 2019 · 10 min
コードリーディング(C言語):chroot / ischroot

コードリーディング(C言語):chroot / ischroot

前書き 本記事は、以下のコマンドのコードリーディング結果を記載しています。 プロセスおよび子プロセスの(見かけ上の)ルートディレクトリを変更するchroot プロセスがchroot環境(jail環境)で動作しているかを検出するischroot ...

January 20, 2019 · 22 min