『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.7.2, clang 13.0.0, NO IDE]
2ヶ月と2週間ぶりに戻ってきました。
別ファイルの型宣言が間違っている場合の検証です。
gccでは警告が出て、clangはスルー、いずれもビルドが通りました。相変わらずclangはゆるいです。
# include "test2.h"
int n;
int main() {
n = 2147483648; // intの最大値 2147483647の次は-2147483648になる(2の補数形式)
// n = 9223372036854775807; // longの最大値ではエラーになる
func(n);
return 0;
}
#include <stdio.h>
extern long n;
void func(long n) {
printf("n : %ld\n", n);
return;
}
n : -2147483648
// clangは警告なし
// gccは警告あり
src/test.c:7:9: warning: implicit conversion from 'long' to 'int' changes value from 2147483648 to -2147483648 [-Wconstant-conversion]
n = 2147483648;
~ ^~~~~~~~~~
1 warning generated.
(lldb) memory read -c32 0x0000000100008010
0x100008010: ff ff ff ff ff ff ff 7f 00 00 00 00 00 00 00 00 ................
0x100008020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................