読者です 読者をやめる 読者になる 読者になる

コードの検査

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の方が後発で強力そう。

なんとか手軽にバグを潰したいものだ。。