1

sscanfC99 でのバッファ オーバーラン防止に役立つ文字列リテラルを作成しようとしています。目標は次のようなものです。

#define MAX_ARG_LEN   16

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0)

明らかな「手動」ソリューションは次のようなものです。

#define MAX_ARG_LEN   16
#define MAX_ARG_CHARS "15"

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0)

ただし、バッファー サイズが 16 の場合に "%15X" を自動的に生成する方法をお勧めます。

提案?

4

1 に答える 1

7

Kernighan と Pike は、彼らの (優れた) 本 ' The Practice of Programmingsprintf() ' でこの問題について議論し、これを行うための最も信頼性が高く移植可能な方法は、 を使用してフォーマット文字列を生成することであると結論付けました。

あなたができることは、マクロを終端のnullを除く長さとして定義し、それを次のように使用することです:

#define STR_EVALUATE(x)   #x
#define STRINGIFY(x)      STR_EVALUATE(x)
#define MAX_ARG_LEN 15
char arg[MAX_ARG_LEN+1] = "";

if (sscanf(arg, "%" STRINGIFY(MAX_ARG_LEN) "X", &input) > 0)
    ...

または、MAX_ARG_STRLEN を 15 として定義し、MAX_ARG_LEN を MAX_ARG_STRLEN+1 として定義して、それに応じて動作させることもできます。

于 2010-04-29T19:15:23.977 に答える