🔧 C23 ・ stdckdint.h ・ C23
ckd_add の使い方bool ckd_add(type1 *result, type2 a, type3 b);
整数の加算をオーバーフローの有無を検出しながら実行するC23の型総称マクロ。結果をresultへ格納し、オーバーフローしていればtrueを返す。セキュリティ上重要な整数演算の安全化に使う。 C23以前は自前でオーバーフロー判定用の条件式を書く必要があり、ミスが起きやすかった問題を解決するために追加された。
#include <stdckdint.h>
#include <stdio.h>
int main(void) {
int result;
if (ckd_add(&result, 2000000000, 2000000000)) {
puts("オーバーフローしました(resultは使いません)");
return 1;
}
printf("%d\n", result);
return 0;
}
⚠️ trueが返ったとき(オーバーフロー)は、格納された値を計算結果として使わず、エラー処理へ分岐します。C23では格納値は折り返した値と規定されていますが、それは正しい答えではありません。
アプリの関数リファレンスで引く(無料・登録不要) 関数一覧へ
ckd_add と一緒に使う関数ckd_mul
ckd_sub
free_aligned_sized
free_sized
stdc_bit_ceil
stdc_bit_floor
stdc_bit_width
stdc_count_ones
stdc_count_zeros
stdc_has_single_bit
stdc_leading_zeros
stdc_trailing_zeros
strndup
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。