コードの検査
Checked Arithmetic Builtins
http://clang.llvm.org/docs/LanguageExtensions.html#checked-arithmetic-builtins
Controlling Code Generation
http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation
Catching Integer Errors with Clanghttp://blog.regehr.org/archives/905
整数オーバーフロー攻撃対策
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c907.html
全てのCプログラマが未定義な振る舞いについて知っておくべきこと #1/3
http://blog-ja.intransient.info/2011/05/c-13.html
全てのCプログラマが未定義な振る舞いについて知っておくべきこと #2/3
http://blog-ja.intransient.info/2011/05/c-23.html
全てのCプログラマが未定義な振る舞いについて知っておくべきこと #3/3
http://blog-ja.intransient.info/2011/06/c-33.html
#include <limits.h> #include <stdio.h> #include <stdlib.h> #ifdef _MSC_VER #define atoll _atoi64 #endif long long test(long long a, long long b) { return (a >> 20) * (b << 34); } int main(int argc, char* argv[]) { if (argc < 3) { puts("usage: input two integer values."); return 1; } long long a = atoll(argv[1]); long long b = atoll(argv[2]); long long c = test(a, b); printf("%lld\n", c); return 0; }
$ clang -fsanitize=integer,unsigned-integer-overflow,shift filename.c $ ./a.out 10000000 1000000000 t3.c:7:24: runtime error: left shift of 1000000000 by 34 places cannot be represented in type 'long long' t3.c:7:19: runtime error: signed integer overflow: 9 * -1266874889709551616 cannot be represented in type 'long long' 7044870066323587072
shortとかcharのoverflowは見ない感じだ。そんなの使わないでintとかlong longを使えという事なのかも。
GCCのオプションで-ftrapvがあるみたいだけれど、これよりclangの方が後発で強力そう。
なんとか手軽にバグを潰したいものだ。。