printf系の関数の書式付けに関する警告で,文字列とそれ以外のデータ型の扱いが異なっている気がします. 下のようなソースコードでconstを付けて定義した文字列 foo の印字に対し, W,../mismatch.c,6,17,W0635,1 番目の変換指定子と、対応する実引数の型が合いません。 が出力されます.
#include <stdio.h> int main(void) { const char *const foo = "foo"; const int bar = 0; (void) printf("%s\n", foo); (void) printf("%d\n", bar); return 0; }
barもfooと同様にconstがついていますが,AdLintはこれについては警告しません. これは,期待された挙動でしょうか?
AdLint 2.2.0,Ubuntu 12.04(64bit)で確認しました.
Anonymous
You seem to have CSS turned off. Please don't fill out this field.
ご報告ありがとうございます。
たしかに、ご指摘の通り %s 変換指定子の実引数チェックのみ、変数の変換可能性を判定する機能に不具合がありました。
ある型のポインタ (T *) が他の型のポインタ (U *) へ自然に変換できるかを判定する際に、T -> U の変換可能性をもとに判定すべきところが、T と U が同一の型であることを判定していました。
ポインタ間の変換可能性の判定を修正し、AdLint 2.4.6 としてリリースいたしました。
お手数おかけしますが、AdLint 2.4.6 にアップデートしていただき、再度ご確認をお願いいたします。
AdLintを 2.4.6 に更新して,文字列のprintfが警告されなくなったことを確認しました. ご対応ありがとうございました.
printf系の関数の書式付けに関する警告で,文字列とそれ以外のデータ型の扱いが異なっている気がします.
下のようなソースコードでconstを付けて定義した文字列 foo の印字に対し,
W,../mismatch.c,6,17,W0635,1 番目の変換指定子と、対応する実引数の型が合いません。
が出力されます.
barもfooと同様にconstがついていますが,AdLintはこれについては警告しません.
これは,期待された挙動でしょうか?
AdLint 2.2.0,Ubuntu 12.04(64bit)で確認しました.
ご報告ありがとうございます。
たしかに、ご指摘の通り %s 変換指定子の実引数チェックのみ、変数の変換可能性を判定する機能に不具合がありました。
ある型のポインタ (T *) が他の型のポインタ (U *) へ自然に変換できるかを判定する際に、T -> U の変換可能性をもとに判定すべきところが、T と U が同一の型であることを判定していました。
ポインタ間の変換可能性の判定を修正し、AdLint 2.4.6 としてリリースいたしました。
お手数おかけしますが、AdLint 2.4.6 にアップデートしていただき、再度ご確認をお願いいたします。
AdLintを 2.4.6 に更新して,文字列のprintfが警告されなくなったことを確認しました.
ご対応ありがとうございました.