関数プロトタイプとコンパイラ属性 - 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 ポインタ不可
まとめ
これらの属性は、コンパイラがより良い最適化を行い、潜在的なバグを検出するために使用されます。適切な属性の使用により、コードの安全性と性能が向上します。