関数プロトタイプとコンパイラ属性 - GawinGowin/libasm GitHub Wiki

概要

本ドキュメントでは、libasm プロジェクトで使用される関数プロトタイプと、GCC コンパイラ属性について説明します。

関数プロトタイプ一覧

関数名 プロトタイプ 説明
ft_strlen size_t ft_strlen(const char *s) 文字列の長さを取得
ft_strcpy char *ft_strcpy(char *dst, const char *src) 文字列をコピー
ft_strcmp int ft_strcmp(const char *s1, const char *s2) 文字列を比較
ft_write ssize_t ft_write(int fd, const void *buf, size_t count) ファイルディスクリプタに書き込み
ft_read ssize_t ft_read(int fd, void *buf, size_t count) ファイルディスクリプタから読み込み
ft_strdup char *ft_strdup(const char *__s) 文字列を複製

コンパイラ属性の説明

例外関連属性

属性 説明 目的
__THROW 関数が C++ 例外を投げないことを示す 最適化の向上、C++ との互換性

最適化関連属性

属性 説明 目的
__attribute_pure__ 関数が純粋関数であることを示す(副作用なし、戻り値は引数のみに依存) コンパイラによる最適化の向上
__attribute_malloc__ 関数が malloc のような動作をすることを示す メモリ最適化、静的解析の向上

安全性関連属性

属性 説明 目的
__nonnull((1)) 第1引数が NULL でないことを要求 静的解析、デバッグ支援
__nonnull((1, 2)) 第1, 2引数が NULL でないことを要求 静的解析、デバッグ支援
__wur (warn unused result) 戻り値を使用しない場合に警告 エラーハンドリングの強制

アクセス制御属性

属性 説明 目的
__attr_access((__read_only__, 2, 3)) 第2引数のメモリを第3引数のサイズ分読み取り専用でアクセス バッファオーバーフロー検出
__fortified_attr_access(__write_only__, 2, 3) 第2引数のメモリを第3引数のサイズ分書き込み専用でアクセス バッファオーバーフロー検出

各関数の詳細解説

ft_strlen

  • 目的: 文字列の長さを計算
  • 属性: __THROW, __attribute_pure__, __nonnull((1))
  • 理由: 純粋関数(副作用なし)、NULL ポインタ不可

ft_strcpy

  • 目的: 文字列をコピー
  • 属性: __THROW, __nonnull((1, 2))
  • 理由: コピー元・先の両方が NULL ポインタ不可

ft_strcmp

  • 目的: 文字列を比較
  • 属性: __THROW, __attribute_pure__, __nonnull((1, 2))
  • 理由: 純粋関数、比較対象の両方が NULL ポインタ不可

ft_write

  • 目的: ファイルディスクリプタに書き込み
  • 属性: __wur, __attr_access((__read_only__, 2, 3))
  • 理由: 戻り値(書き込みバイト数)の確認が重要、バッファは読み取り専用

ft_read

  • 目的: ファイルディスクリプタから読み込み
  • 属性: __wur, __fortified_attr_access(__write_only__, 2, 3)
  • 理由: 戻り値(読み込みバイト数)の確認が重要、バッファは書き込み専用

ft_strdup

  • 目的: 文字列を複製(動的メモリ確保)
  • 属性: __THROW, __attribute_malloc__, __nonnull((1))
  • 理由: malloc類似の動作、コピー元が NULL ポインタ不可

まとめ

これらの属性は、コンパイラがより良い最適化を行い、潜在的なバグを検出するために使用されます。適切な属性の使用により、コードの安全性と性能が向上します。