glibcの実装から、次のようになります。
印刷できる年のサイズを制限します。使用される%d形式指定子を使用すると、1900を加算すると数値がオーバーフローし、負の値が出力されます。一部のアーキテクチャでは、理論的には%ldまたはこれよりも大きい整数形式を使用できますが、これは出力にさらに多くのスペースが必要になることを意味します。'asctime_r'インターフェイスが適切に定義され、バッファサイズが渡される場合、これは問題にはなりません。
以下のプログラムを実行して、マシンの正確な制限を見つけてください。
#include <limits.h>
#include <stdio.h>
#include <time.h>
/**
* Find the largest time_t for which ctime returns a non-NULL value
* using a bsearch between 0 and LONG_MAX.
**/
static time_t ctime_max() {
time_t start = 0, end = LONG_MAX, mid;
while (start < end) {
mid = start + (end - start) / 2;
if (ctime(&mid)) {
/* this mid is ctime-able; try higher */
start = mid + 1;
} else {
/* this mid is not ctime-able; try lower */
end = mid;
}
}
/* mid is now the lowest number that's too high; subtract one */
return mid - 1;
}
int main() {
time_t t = ctime_max();
printf("%s", ctime(&t));
return 0;
}
私にとってはTue Dec 31 23:59:59 2147483647
、年が4つの署名されたバイトをオーバーフローする前にたまたま2番目になります。