a.c
typedef unsigned char u8;
int checksum(const u8 *buf, size_t len)
{
u8 sum = 0;
size_t a;
for (a = 0; a < len; a++)
sum += buf[a];
return (sum == 0);
}
dmidecodeのutil.cの内容だが、コンパイル時に警告を出すようにしていると、
以下のような警告が出てくる。
warning: conversion to ‘u8 {aka unsigned char}’ from ‘int’ may alter its value [-Wconversion]
sum += buf[a];
u8同士を計算しているように見えるが、計算するときに暗黙でintで計算される。
このため、計算結果(int)から 、sum(u8)に変換すると値が変更されることがあります、と警告される。
警告を出さないように、以下のようにしてみた。
a.c
int checksum(const u8 *buf, size_t len)
{
int sum = 0;
size_t a;
for (a = 0; a < len; a++)
sum += buf[a];
return ((0xff & sum) == 0);
}
足される側のsumを、最初からintにしておけば、計算結果もsumもintなので、警告は出ない。
ただ、sumがintになっているので、最終的に返す結果が異なってしまう。
1バイトから桁あふれした部分の値があると、1バイト分が0であっても、falseが返ってしまうので、
0xffとのandを取って、1バイト分が0なら、trueが返るようにした。
指摘の通り、以下で問題なかったです。ありがとうございます。
a.c
typedef unsigned char u8;
int checksum(const u8 *buf, size_t len)
{
u8 sum = 0;
size_t a;
for (a = 0; a < len; a++)
sum = (u8)(sum + buf[a]);
return (sum == 0);
}
以下にも同じ内容がありました。。。
http://stackoverflow.com/questions/21335452/gcc-conversion-warning